了解以下代码

时间:2016-04-18 08:05:53

标签: arrays calloc

提供此代码:

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语句的条件是索引i的A元素小于或等于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,但我不明白为什么。

1 个答案:

答案 0 :(得分:0)

所以这就是我的理解:

  1. 忽略A中优于X的每个值。 (A[i] <= X
  2. 忽略A中的每个重复值:这是(jumps+A[i])语句的目的。
  3. 最后,如果你的A数组包含至少X个低于X的唯一值,它将返回当前循环的索引。
  4. 结论:如果X是10.那么它将返回A的索引,当函数无论它们的顺序是什么时都会找到从0到9的每个值。如果没有找到返回-1。 ++计数器使它停止9而不是10。