Существует массив размера n, а элементы, содержащиеся в массиве, находятся между 1 и n-1, так что каждый элемент возникает один раз, и только один элемент встречается более одного раза. Нам нужно найти этот элемент.
Хотя это очень часто задаваемые вопросы, я до сих пор не нашел правильного ответа. Большинство предложений заключается в том, что я должен добавить все элементы в массиве, а затем вычесть из него сумму всех индексов, но это не сработает, если количество элементов очень велико. Он переполнится. Были также предложения относительно использования XOR gate dup = dup ^ arr[i] ^ i
, которые мне не понятны.
Я придумал этот алгоритм, который является усовершенствованием алгоритма сложения и в значительной степени уменьшит вероятность переполнения!
for i=0 to n-1
begin :
diff = A[i] - i;
sum = sum + diff;
end
diff
содержит дублирующий элемент, но с помощью этого метода я не могу найти индекс дублирующего элемента. Для этого мне нужно снова пройти массив, что нежелательно. Может ли кто-нибудь придумать лучшее решение, которое не связано с методом добавления, или метод XOR работает в O (n)?