如何在数组中找到未耦合的整数?

时间:2012-04-12 05:53:59

标签: c++ c algorithm

  

可能重复:
  Find integer not occurring twice in an array
  Accenture interview question - find the only unpaired element in the array

给定一个奇数大小的整数数组。除了单个整数外,数组中的所有整数都会出现两次。如何以最有效(内存和复杂性)的方式找到这个非耦合的整数?

2 个答案:

答案 0 :(得分:14)

如果你把它们全部排除在一起,你最终会得到唯一的(解耦)值。

这是因为x XOR x对于所有x值为零,而0 XOR xx

举例来说,以下程序输出99

#include <stdio.h>
int main (void) {
    int num[] = { 1, 2, 3, 4, 5, 99, 1, 2, 3, 4, 5};
    unsigned int i;
    int accum;

    for (accum = 0, i = 0; i < sizeof(num)/sizeof(*num); i++)
        accum ^= num[i];

    printf ("%d\n", accum);

    return 0;
}

在效率方面,它基本上是O(1)空间和O(n)时间复杂度,最小,平均和最差情况。

答案 1 :(得分:1)

正如pax所说,将所有元素混合在一起会给你单独的价值。

int getUncoupled(int *values, int len)
{
    int uncoupled = 0;
    for(int i = 0; i < len; i++)
        uncoupled ^= values[i];
    return uncoupled;
}

然而,这里有一个小小的警告:没有未耦合的值和一个非耦合值为零的集合之间的区别是什么? x^x^y^y = 0x^x^0^y^y也不等于零?值得深思的思念:)