发现个异或的妙用

有个题目是这样子的:Single Number
题目要求如下:Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
意思就是一个数组[2,2,3,3,5] 5就是那个 single numble了
然后自己想了半天也就会笨办法,倒也能通过,然后看了一下前面人的解法,又一次打开了脑洞

大佬的代码如下:

1
2
3
4
5
6
7
8
9
10
var singleNumber = function(nums) {
if (!nums || nums.length === 0) {
throw new Error();
}
var res = nums[0];
for (var i = 1; i < nums.length; i++) {
res ^= nums[i];
}
return res;
};

一开始我还没有看懂为什么异或就可以,不就是相同为0,不同为1啊,然后单步进去运行了一下,还是一头雾水(单步的时候res没有规律),出去上个厕所,喝口水。然后突然想到,从把数组所有的数字全拿出来,一个一个异或,可以看成相同的和相同的异或,然后得到的是0 ,最后剩下一个奇数的single number,把他和0异或(^)就得到他本身啊。

多动动,多喝水,没事上个厕所,买个小黄鸭,换个角度,问题就迎刃而解啊啊啊啊啊啊!!!!

感觉不错的话给博主赞助一下呗