如何理解利用按位异或来得到数组中不重复的项?

Fakefish
  • 4.3k
var singleNumber = function(nums) {
    for(var i = 1,len = nums.length;i<len;i++) {
        nums[0] ^= nums[i]
    }
    return nums[0]
};

获取数组中只出现过一次的数字的算法,用到了XOR,但不太能理解

singleNumber([1,3,1,4,6,4,6,5,3])

[3, 3, 1, 4, 6, 4, 6, 5, 3]
[7, 3, 1, 4, 6, 4, 6, 5, 3]
[1, 3, 1, 4, 6, 4, 6, 5, 3]
[5, 3, 1, 4, 6, 4, 6, 5, 3]
[3, 3, 1, 4, 6, 4, 6, 5, 3]
[6, 3, 1, 4, 6, 4, 6, 5, 3]
[5, 3, 1, 4, 6, 4, 6, 5, 3]

只记得自身的XOR会得到0

回复
阅读 3.1k
2 个回答
✓ 已被采纳
  1. a^a=0
  2. 0^a=a
  3. 异或满足交换率和结合率

因此a^b^c^b^c=a^(b^b)^(c^c)=a

没意义,你只有假设整个数组,只有唯一一个奇数出现的数字。有这样的场景吗?

宣传栏