你有一个n = 2k + 2个元素的数组,其中2个元素没有配对。 8个elemets数组的示例:1 2 3 47 3 1 2 0.“47”和“0”没有数组配对。如果我有只有1个元素没有配对的数组,我用XOR解决了这个问题。但我有两个不对的元素!我能做什么?解决方案可能是O(n)时间性能和O(1)额外内存。
答案 0 :(得分:8)
一些提示......
需要2次传球。首先,浏览列表并将所有元素XOR组合在一起。看看你得到了什么。从那里继续。
编辑:关于第一遍结果的关键观察应该是它显示了2个不成对元素不同的位集。
答案 1 :(得分:1)
使用INT_MAX / 8字节内存。走阵列。 XOR与每个值对应的位为1.如果有0或2个实例,该位将结束0.如果只有一个实例,则将设置该位。 O(1)mem,O(N)时间。
答案 2 :(得分:0)
这是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。