1

Тема: Знаходження дублікату в масиві за допомогою xor

Намагаюся знайти дублікат у масиві за допомогою xor ось так:

        vector<int> nums {1, 2, 2 4};
        int item { 0 };
        int n = nums.size();

        for (int i = 0; i < n; ++i) {
            item ^= nums[i];
        }

        for (int i = 1; i <= n; ++i) {
            item ^= i;
        }

        cout << item << endl;

Не працює. Не можу зрозуміти чому.

2

Re: Знаходження дублікату в масиві за допомогою xor

Масив неправильно задано. Треба або прибрати 4, або додати 3.

3

Re: Знаходження дублікату в масиві за допомогою xor

А чому ви, власне, вирішили, що так можна знайти дублікат?

4

Re: Знаходження дублікату в масиві за допомогою xor

koala написав:

А чому ви, власне, вирішили, що так можна знайти дублікат?

Це використання властивості А^А = 0. Але масив має містити цілі числа від 1 до n,
які послідовно збільшуються, окрім дублікатів.
Тобто для {1, 2, 2} або {1, 2, 2, 3} — це спрацює. А от для {1, 2, 2, 4} — ні.
І в другом циклі там i<n має бути.

5

Re: Знаходження дублікату в масиві за допомогою xor

Цікаво, а можна XOR(1..n) знайти швидше за O(n)? Ніби у мене за логарифмічний час виходить.

6

Re: Знаходження дублікату в масиві за допомогою xor

koala написав:

Цікаво, а можна XOR(1..n) знайти швидше за O(n)? Ніби у мене за логарифмічний час виходить.

Думаю, ні. Там же треба перебирати всі елементи, неможливо відкинути якусь частину, як при бінарному пошуку.

7

Re: Знаходження дублікату в масиві за допомогою xor

Для масиву - не можна. А от для чисел від 1 до n - можна.
Підказка: чому дорівнює XOR усіх чисел від 1 до 2n?

8

Re: Знаходження дублікату в масиві за допомогою xor

koala написав:

Для масиву - не можна. А от для чисел від 1 до n - можна.
Підказка: чому дорівнює XOR усіх чисел від 1 до 2n?

Гадки не маю, чому він дорівнює, log2(n)? Мені був потрібен лише певний проміжок, а не всі числа від 1 до n.