Понимание следующего кода

Дайте этот код:

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));
Это создает массив, хранящий X+1 элементов типа int. Поскольку это 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, но я не понимаю, почему.


person C Curious    schedule 18.04.2016    source источник
comment
Извините, первый раз пишу. Я пытался сделать его более красивым, но я не знаю, почему все это смешано.   -  person C Curious    schedule 18.04.2016


Ответы (1)


Итак, вот что я понимаю:

  1. каждое значение в A, превосходящее X, игнорируется. (A[i] <= X)
  2. каждое повторяющееся значение в A игнорируется: это цель операторов (jumps+A[i]).
  3. наконец, он вернет индекс текущего цикла, если ваш массив A содержит не менее X уникальных значений, меньших X.

Вывод: если X равно 10. Тогда он вернет индекс A, когда функция найдет каждое значение от 0 до 9 один раз, независимо от их порядка. Если не найдено, верните -1. Счетчик ++ делает так, чтобы он останавливал 9, а не 10.

person Walfrat    schedule 18.04.2016