看到了一段有趣的代码,可以在重复数字列表中找到一个孤独的数字(列表中的每个数字都出现两次,除了一个(。
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 ^= b
与a = 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)
,您无法确定是否具有一个或多个唯一值。