[转载自知乎——有哪些令人拍案叫绝的算法?] [侵必付] 关于位运算

https://www.zhihu.com/question/27547892



一直觉得位运算是一个很神奇的东西,至今还不太理解异或符号的意义。


作者:知乎用户
链接:https://www.zhihu.com/question/27547892/answer/131156330
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

有一个n个元素的数组,除了一个元素只出现一次外,其他元素都出现两次,让你找出这个只出现一次的元素是几,要求时间复杂度为O(n)且不再开辟新的内存空间。
——————————答案分割线—————————















解法是将所有元素做异或运算,即a[1] XOR a[2] XOR a[3] XOR…XOR a[n],所得的结果就是那个只出现一次的数字,时间复杂度为O(n)。

当时看了答案后就一拍脑瓜,感叹这个技巧真不错。然而直到我遇见了这道题的进阶版,当时真是恍然大悟拍案叫绝。

进阶版:有一个n个元素的数组,除了两个数只出现一次外,其余元素都出现两次,让你找出这两个只出现一次的数分别是几,要求时间复杂度为O(n)且再开辟的内存空间固定(与n无关)。
——————————答案分割线————————


















首先,仿照前面的算法,把所有元素异或,得到的结果就是那两个只出现一次的元素异或的结果。

然后,重点来了,因为这两个只出现一次的元素一定是不相同的,所以这两个元素的二进制形式肯定至少有某一位是不同的,即一个为0,另一个为1,找到这一位。

可以根据前面异或得到的数字找到这一位,怎么找呢?稍加分析就可以知道,异或得到这个数字二进制形式中任意一个为1的位都是我们要找的那一位,找到这一位就可以了(这很容易)。

再然后,以这一位是1还是0为标准,将数组的n个元素分成了两部分,将这一位为0的所有元素做异或,得出的数就是只出现一次的数中的一个;将这一位为1的所有元素做异或,得出的数就是只出现一次的数中的另一个。从而解出题目。忽略寻找不同位的过程,总共遍历数组两次,时间复杂度为O(n)。




——————————大奶牛解释分割线————————

我能说之前我都没太懂这题的做法么。。。。QAQ

感谢hls。。

再仔细一看原答案好像其实已经说得很清楚了

不解释了(⊙﹏⊙)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值