Обновление 2: Некоторые люди думают, что использование XOR для поиска повторяющегося числа - это хак или трюк. На что мой официальный ответ таков: «Я не ищу дубликат числа, я ищу дубликат паттерна в массиве наборов битов. И XOR определенно подходит лучше, чем ADD, для манипулирования наборами битов». : -)
Обновление: Просто для удовольствия, прежде чем я ложусь спать, вот альтернативное решение "в одну строку", которое требует нулевого дополнительного хранилища (даже не счетчика циклов), касается каждого элемента массива только один раз, не -разрушающий и не масштабируется вообще: -)
printf("Answer : %d\n",
array[0] ^
array[1] ^
array[2] ^
// continue typing...
array[999] ^
array[1000] ^
1 ^
2 ^
// continue typing...
999^
1000
);
Обратите внимание, что компилятор фактически вычислит вторую половину этого выражения во время компиляции, поэтому «алгоритм» будет выполнен ровно за 1002 операции.
И если значения элементов массива также известны во время компиляции, компилятор оптимизирует весь оператор до константы. : -)
Оригинальное решение: Которое не соответствует строгим требованиям вопросов, даже если оно работает, чтобы найти правильный ответ. Он использует одно дополнительное целое число для хранения счетчика цикла и обращается к каждому элементу массива три раза - дважды, чтобы прочитать его и записать его на текущей итерации, и один раз, чтобы прочитать его для следующей итерации.
Ну, вам нужна хотя бы одна дополнительная переменная (или регистр ЦП) для хранения индекса текущего элемента при прохождении массива.
Кроме этого, вот деструктивный алгоритм, который может безопасно масштабироваться для любого N вплоть до MAX_INT.
for (int i = 1; i < 1001; i++)
{
array[i] = array[i] ^ array[i-1] ^ i;
}
printf("Answer : %d\n", array[1000]);
Я оставлю упражнение, чтобы выяснить, почему это работает для вас, с простой подсказкой: -):
a ^ a = 0
0 ^ a = a