题目描述:
有N个数,这N个数中只有2个数是只出现一次,剩下所有的数都会出现2次。问题是,如何高效的找出那2个只出现一次数 ?
时间复杂度O(n),空间复杂度O(1).
-------------------------------------
如果是说N个数中存在1个数只出现一次,其余的数都出现了2次。那么遍历一次这N个数,将其作异或操作,得出的结果res即为所求。
--------------------------------
题目深入探讨:
2个数都只出现1次,可知这2个数必不同。假设为A与B
即A ^ B != 0, 即所有数异或结果res中必有1位非0,找出该位很关键。res = A ^ B
假设A = 110、B = 011
A ^ B = 101
如发现该位是处在最低位num = 1,则
int a = 0;
int b = 0;
for(x: list)
{
if(x & num)
a ^= x;
else
b ^= x;
}
结果就算出来了
--------------------------------------
如何找到res二进制表示下的1的位置
num = res & ~(res-1)
可得A/B两数的不同的最低位