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。。
再仔细一看原答案好像其实已经说得很清楚了
不解释了(⊙﹏⊙)