"^="运算符在此查找非配对数字算法中做什么?



看到了一段有趣的代码,可以在重复数字列表中找到一个孤独的数字(列表中的每个数字都出现两次,除了一个(。

function findNonPaired(listOfNumbers) {
  let nonPairedNumber = 0
  listOfNumbers.forEach((n) => {
      nonPairedNumber ^= n
  })
  return nonPairedNumber
}
const x = [1,5,4,3,9,2,3,1,4,5,9]
console.log(findNonPaired(x))

这个解决方案看起来非常优雅,但我很好奇^=运算符实际上在这里做什么?

>a ^= ba = a ^ b相同,其中^是按位XOR运算符。

0 ^ 0 === 0
1 ^ 0 === 1
0 ^ 1 === 1
1 ^ 1 === 0

这是一个简洁的算法。让我们使用列表[8, 12, 8]跟踪一个执行,例如:

0 ^ 8 = 0000 ^ 1000 = 1000
        1000 ^ 1100 = 0100
        0100 ^ 1000 = 1100 = 12

"重复"一词不正确。此算法测试奇偶校验。一个简单但有些错误的定义是"当一切都有一对时"。双。。。平价。

[2,2,2,3,3,5,5,5,5]将返回2因为其他所有内容都有一对。

[3,4,5]实际上将返回 2 (011^100^101 -> 010 (,因为这是所有未配对项目的异或。

就像其他答案说的那样 - 这是一个按位的异或。

关于算法 - 如果您确定重复项是偶数,那就很酷了。当一个数字用x进行异或运算,然后又用x进行异或运算时,它将返回到它的前一个值。如果一个数字在这个链中出现 3 次,第 3 次出现将愚弄这个算法。此外,如果链中还有一个值是单个的,例如:

a, b, c, X, a, c, b, Y

结果将是(X ^ Y),您无法确定是否具有一个或多个唯一值。

最新更新