2016-04-18 89 views
0

给这个代码:了解下面的代码

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; 
} 

这是我想我知道:

1)int *jumps = calloc(X+1, sizeof(int));
这是使阵列中存储一个int型的X + 1组的元素。由于它是 calloc它们都被初始化为0。

2)if(A[i]<=X && *(jumps+A[i])!=1) 这个if语句的条件是,A元素索引i小于或等于X和第二部分,我混淆。我完全困惑什么*(jumps+A[i])!=1)的意思。我知道无论*(jumps+A[i])是不能等于1.

3)if(++counter==X) 这也让我困惑。我不知道++counter之前做了什么。我认为++被用来增加1的东西。另外,counter如何更改?如果给出例子(5,[1,3,1,4,2,3,5,4]),它会变成5,但我不明白为什么。

+0

对不起,第一次发布。我试图让它看起来更漂亮,但我不知道为什么它们都在一起。 –

回答

0

所以这是我的理解:

  1. 每值一个是优于X被忽略。 (A[i] <= X
  2. A中的每个重复值都被忽略:这是(jumps+A[i])语句的用途。
  3. 最后如果您的A数组包含次于X.至少X唯一值它将返回电流环路的索引

结论:如果X是10。然后它会返回A的索引,当一旦它们的顺序无效,函数就会找到从0到9的每个值。如果未找到,则返回-1。 ++计数器使它停止9而不是10.