可能重复:
Find integer not occurring twice in an array
Accenture interview question - find the only unpaired element in the array
给定一个奇数大小的整数数组。除了单个整数外,数组中的所有整数都会出现两次。如何以最有效(内存和复杂性)的方式找到这个非耦合的整数?
答案 0 :(得分:14)
如果你把它们全部排除在一起,你最终会得到唯一的(解耦)值。
这是因为x
XOR x
对于所有x
值为零,而0
XOR x
为x
。
举例来说,以下程序输出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 = 0
但x^x^0^y^y
也不等于零?值得深思的思念:)