2016-04-18 16 views
0

Geben Sie diesen Code zu verstehen:den folgenden Code

int solution(int X, int A[], int N) { 
    int *jumps = calloc(X+1, sizeof(int)); 
    int counter = 0; 
    int i; 

    for(i=0; i<N; i++) { 
     if(A[i]<=X && *(jumps+A[i])!=1) { 
      *(jumps+A[i])=1; 
      if(++counter==X) { 
       return i; 
      } 
     } 
    } 

    free(jumps); 
    return -1; 
} 

Hier ist, was ich glaube, ich weiß:

1) int *jumps = calloc(X+1, sizeof(int));
Dieses ein Array macht X + 1 Elemente eines int-Typ zu speichern. Da es calloc ist alles wie 0.

2) if(A[i]<=X && *(jumps+A[i])!=1) Dieses initialisiert sie if-Anweisung der Bedingung ist, dass das Element der A bei Index i kleiner als oder gleich X und den zweiten Teil I mit verwirrt bin. Ich bin total verwirrt was *(jumps+A[i])!=1) bedeutet. Ich weiß, dass was auch immer *(jumps+A[i]) ist kann nicht gleich 1.

3) if(++counter==X) Das verwirrt mich auch. Ich bin mir nicht sicher, was ++ vor counter tut. Ich dachte, ++ wurde verwendet, um ein Inkrement von 1 zu etwas hinzuzufügen. Wie ändert sich auch counter? Wenn man das Beispiel (5, [1,3,1,4,2,3,5,4]) angibt, ändert es sich zu 5, aber ich verstehe nicht warum.

+0

Sorry erstes Mal Posting. Ich habe versucht, es hübscher aussehen zu lassen, aber ich weiß nicht, warum alles zusammengespielt hat. –

Antwort

0

Also hier ist, was ich verstehen:

  1. jeder Wert in A, die X überlegen ignoriert werden. (A[i] <= X)
  2. jeder doppelte Wert in A werden ignoriert: das ist der Zweck von (jumps+A[i]) Aussagen.
  3. Schließlich wird er den Index der Stromschleife zurück, wenn Ihre A-Array enthält mindestens X eindeutige Werte schlechter als X.

Fazit: Wenn X 10. Dann wird der Index eines zurückzukehren, wenn die Die Funktion hat alle Werte von 0 bis 9 einmal gefunden, unabhängig von ihrer Reihenfolge. Wenn nicht gefunden, gib -1 zurück. Der ++ Zähler macht es so, dass es eine 9 und nicht 10 stoppen wird.