Предположим, что массив имеет целые числа от 1 до 1000000.
Я знаю несколько популярных способов решения этой проблемы:
- Если все числа от 1 до 1 000 000 включены, найдите сумму элементов массива и вычтите ее из общей суммы (n * n + 1/2)
- Использование хэш-карты (требуется дополнительная память)
- Используйте бит-карту (меньше служебных данных памяти)
Недавно я встретил другое решение, и мне нужна помощь в понимании логики, стоящей за ней:
Держите один накопитель радикса. Вы эксклюзивный или аккумулятор с как индекс, так и значение в этом индексе.
Здесь полезен тот факт, что x ^ C ^ x == C, так как каждое число будет xor'd дважды, кроме того, что там дважды, что появится 3 раз. (x ^ x ^ x == x) И последний индекс, который появится один раз. Поэтому, если мы выберем аккумулятор с окончательным индексом, конечное значение будет числом, которое находится в списке дважды.
Буду признателен, если кто-то может помочь мне понять логику этого подхода (с небольшим примером!).