Трюк XOR работает в два прохода с массивом только для чтения.
Это позволяет избежать проблемы возможных целочисленных переполнений, которые имеет решение для суммы и суммы квадратов.
Пусть два числа будут x
и y
, одно из которых является пропущенным, а другое повторяется.
XOR всех элементов массива вместе с 1,2,...,N
.
Результат w = x XOR y
.
Теперь, поскольку x
и y
различны, w
не равен нулю.
Выберите любой ненулевой бит w
. x
и y
отличаются этим битом. Скажем, позиция бита k
.
Теперь рассмотрим разбиение массива (и чисел 1,2,...,N
) на два набора в зависимости от того, равен ли бит в позиции k 0 или 1.
Теперь, если мы вычислим XOR (отдельно) элементов двух наборов, результат должен быть x
и y
.
Поскольку критерием разделения является просто проверка, установлен ли бит или нет, мы можем вычислить два XOR из двух наборов, сделав еще один проход через массив и имея две переменные, каждая из которых содержит XOR элементов видел до сих пор (и 1,2,...N
), для каждого набора. В конце, когда мы закончим, эти две переменные будут содержать x
и y
.
Похожие: