【发布时间】:2012-04-12 05:53:58
【问题描述】:
可能重复:
Find integer not occurring twice in an array
Accenture interview question - find the only unpaired element in the array
给定一个奇数大小的整数数组。数组中的所有整数都出现两次,除了一个整数。如何以最有效(内存和复杂性)的方式找到这个解耦整数?
【问题讨论】:
可能重复:
Find integer not occurring twice in an array
Accenture interview question - find the only unpaired element in the array
给定一个奇数大小的整数数组。数组中的所有整数都出现两次,除了一个整数。如何以最有效(内存和复杂性)的方式找到这个解耦整数?
【问题讨论】:
如果将它们全部异或,最终将得到唯一的(未耦合的)值。
这是因为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) 时间复杂度,最小、平均和最坏情况。
【讨论】:
正如 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 不也等于零吗?值得深思:)
【讨论】:
x^x^y^y 是不可能的。