2016-11-10 5 views
0

Ich versuche ein Problem zu lösen, das kleinste und zweitkleinste Element in einem Array zu finden.Mehrere Iterationen in einer While-Schleife ausführen

Ich denke darüber nach, zwei Zeiger auf den 0. Index des Arrays zu setzen. Beide Zeiger bewegen sich von links nach rechts und durchqueren das gesamte Array. Der erste Zeiger ptr1 bestimmt das min-Element, während der zweite Zeiger das zweite min-Element bestimmen soll. Der erste Zeiger funktioniert, aber der zweite Zeiger wird nicht durchlaufen. While-Schleife endet erst nach 1 Iteration des zweiten Zeigers.

Ist es möglich, n Zeiger in einer while-Schleife haben & sie durch wiederum nach rechts abbiegen von links überqueren machen ?

Oder ich mache etwas falsch.

Unten ist der Code

int arr[] = {12,13,1,10,34,1}; 
     int ptr1 = 0; 
     int ptr2 =0; 
     int min = Integer.MAX_VALUE; 
     int minSec = Integer.MAX_VALUE; 
     int arrLen=arr.length-1; 

     while(ptr1<arrLen && ptr2<arrLen){ 

      if(arr[ptr1]<min){ // this if works great finds the min element 
       min=arr[ptr1]; 
       ptr1++; 
      }else{ 
       ptr1++; 
      } 

      //flow enters once & exits the while loop 
      if(ptr1==arrLen && arr[ptr2]<minSec && arr[ptr2]>min){ 
       minSec=arr[ptr2]; 
       ptr2++; 
      }else if(ptr1==arrLen){ 
       ptr2++; 
      } 
     } 

     System.out.println("min: " + min + " second min: "+ minSec) 

Ausgang: min: 1 second min: 12

die korrekte Ausgabe min: 1 second min: 10

sein soll ich bin in der Lage, das Problem mit einem anderen Ansatz zu lösen, Code unten. Ich muss nur über den While-Loop-Ansatz wissen.

for (int i = 0; i <= arrLen ; i ++) 
     { 
      /* If current element is smaller than first 
       then update both first and second */ 
      if (arr[i] < min) 
      { 
       minSec = min; 
       min = arr[i]; 
      } 

      /* If arr[i] is in between first and second 
       then update second */ 
      else if (arr[i] < minSec && arr[i] != min) 
       minSec = arr[i]; 
     } 
+0

Was zeigt der Debugger? –

+0

debugger gibt nur die zweite ein, wenn sie einmal gesetzt ist, setzt das secondMin und beendet die while-Schleife – underdog

+0

Ihr zweiter Ansatz macht mehr Sinn (anders als 'i <= arrLen') und hat eine bessere Laufzeit. Warum brauchen Sie den ersten Ansatz? –

Antwort

1

Da ptr2 Wert 0 bis Schleife zum Ende

if(ptr1==arrLen && arr[ptr2]<minSec && arr[ptr2]>min){ 
       minSec=arr[ptr2]; 
       ptr2++; 
} 

und geben Sie in die, wenn die Bedingung nur erreichen ptr1==arrLen dann Sie den minSec Wert als minSec=arr[ptr2] wählen. Es hat keinen Sinn, diese Bedingung hier zu stellen.

So Sekunde, wenn Bedingung

sein wird
if(arr[ptr2]<minSec && arr[ptr2]>min){ 
    minSec=arr[ptr2]; 
    ptr2++; 
}else{ 
    ptr2++; 
} 
0

Ihr Problem ist, dass die erste if-Anweisung auch dann funktioniert, wenn Sie die kleinste Zahl gefunden haben. Daher sind alle überfahrenen Elemente entweder größer oder gleich der kleinsten Zahl. Das bedeutet, dass Zeiger 1 in jedem "Schritt" inkrementiert wird. In Ihrer zweiten if-Anweisung prüfen Sie, ob der Zeiger 1 gleich der Array-Länge ist, aber dieser Fall ist nur in einem "while step" vorhanden.

PS: Lassen Sie einfach java Ihr Array sortieren. Die Arbeit ist bereits erledigt;)

0

Sie brauchen nicht zwei Zeiger

int arr[] = {12,13,1,10,34,1}; 
final int arrLen=arr.length; 
int min = Integer.MAX_VALUE; 
int minSec = Integer.MAX_VALUE; 
for (int e=0; e<arrLen; e++) { 
    final int v = arr[e]; 
    if (v<minSec && v>min) 
     minSec = v; 
    if (v<min && v<minSec) 
     min = v; 
} 
if (min>minSec) 
    min = minSec; 
0

Das Problem ist in dieser while(ptr1<arrLen && ptr2<arrLen) Anweisung gekoppelt mit dem zweiten Zeiger zu bewegen, nur wenn ptr1 endlich ist .

Was passiert ist, ptr1 bei arrLen ist so der zweite Zeiger Iterierten einmal, sondern weil Sie einen && verwenden, wenn ptr1<arrLen wird evalued die gesamte Schleife beendet falsch. Das Verwenden von oder wird das nicht beheben, da Sie andere Probleme in dem Code haben, der ein IndexOutOfBoundsError verursachen wird.

+0

Auch wenn ich die Bedingung als while (ptr1 <= arrLen && ptr2 underdog

+1

Das liegt daran, dass Sie im Else-Block weiterhin ptr1 inkrementieren, also ist es immer gleich arr.length nach dem ersten ptr2-Inkrement Wenn Sie die Schleife nicht verlassen haben, erhalten Sie einen IndexOutOfBounds-Fehler Bleibt es bei Ihrer for-loop-Lösung, kann die While-Schleife zwar funktionieren, wird aber komplexer. – shad

Verwandte Themen