在一般情况下,所描述的算法实际上无法在数组中找到孤独的整数。它真正找到的是XOR
在那里出现奇数次的所有元素。
因此,如果那里只有一个“孤独”元素,比如一个元素'a'
,并且所有其他元素在数组中出现偶数次,那么它会“按要求”工作 -> 它会找到这个孤独的元素'a'
。
为什么?
该算法执行XOR
数组中的所有元素(a ^ b ^ c ^ d ^ ...)
该XOR
操作具有以下属性:
1) a ^ a = 0 (non-equivalence)
2) a ^ 0 = a (neutrality of 0)
3) a ^ b = b ^ a (commutative property)
4)(a ^ b) ^ c = a ^ (b ^ c) (associative property)
例如,让我们假设一个包含元素的数组:{a, b, c, a, c, b, a, c}
(元素'a'
- 3 次,元素'b'
- 两次,元素'c'
- 3 次)
然后,根据上述XOR
性质,算法结果
R = (((((((a ^ b) ^ c) ^ a) ^ c) ^ b) ^ a) ^ c)
可以重新排列如下:
R = (a ^ b) ^ (c ^ a) ^ (c ^ b) ^ (a ^ c) =
= (a ^ a) ^ (b ^ b) ^ (c ^ c) ^ (a ^ c) =
= 0 ^ 0 ^ 0 ^ (a ^ c) = (a ^ c)
IE,
a) ...所有出现偶数次的元素都为零
b) ...所有出现奇数次的元素都经过异或运算并创建最终结果
XOR
是按位操作,所以它当然永远不会溢出。