异或操作符的妙用

题目描述:

 

有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两数的不同的最低位

阅读更多
文章标签: list
个人分类: 零散碎片
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭