如何在数组中找到2个不成对的元素?

时间:2012-02-02 15:28:33

标签: c algorithm discrete-mathematics array-algorithms

你有一个n = 2k + 2个元素的数组,其中2个元素没有配对。 8个elemets数组的示例:1 2 3 47 3 1 2 0.“47”和“0”没有数组配对。如果我有只有1个元素没有配对的数组,我用XOR解决了这个问题。但我有两个不对的元素!我能做什么?解决方案可能是O(n)时间性能和O(1)额外内存。

4 个答案:

答案 0 :(得分:8)

一些提示......

需要2次传球。首先,浏览列表并将所有元素XOR组合在一起。看看你得到了什么。从那里继续。

编辑:关于第一遍结果的关键观察应该是它显示了2个不成对元素不同的位集。

答案 1 :(得分:1)

使用INT_MAX / 8字节内存。走阵列。 XOR与每个值对应的位为1.如果有0或2个实例,该位将结束0.如果只有一个实例,则将设置该位。 O(1)mem,O(N)时间。

答案 2 :(得分:0)

  1. 扫描阵列并将每个数字和计数放入哈希值。
  2. 重新扫描并找出count = 1的项目。
  3. 这是O(n)。

答案 3 :(得分:0)

你可以尝试一下。这需要花费O(n)时间

        int xor = arr[0];
        int set_bit_no;
        int i;
        int x = 0; //First unpair number
        int y = 0; //second unpair number
        for (i = 1; i < n; i++)
            xor ^= arr[i];

        set_bit_no = xor & ~(xor-1);//Get the rightmost set bit in set_bit_no
        for (i = 0; i < n; i++)
        {
            if (arr[i] & set_bit_no) {
                //XOR of first set 
                x = x ^ arr[i];
            }
            else
            {
                //XOR of second set
                y = y ^ arr[i];
            }
        }

...说明    arr [] = {2,4,7,9,2,4} 1)获得所有元素的XOR。      xor = 2 ^ 4 ^ 7 ^ 9 ^ 2 ^ 4 = 14(1110) 2)得到一个只有一个xor的位数的数字    由于我们可以轻松获得最右边的设置位,让我们使用它。      set_bit_no = xor&amp; 〜(xor-1)=(1110)&amp; 〜(1101)= 0010    现在set_bit_no将只设置为xor的最右设置位。 3)现在将元素分成两组并执行x的xor    每组中的元素,我们得到非重复    要素7和9。