我遇到了一个常见的编程面试问题:给定一个无符号整数列表,找到在列表中出现奇数次的整数。例如,如果给定以下列表:
{2,3,5,2,5,5,3}
答案应该是整数5,因为它在列表中出现了3次,而其他整数出现了偶数次。
我的原始解决方案涉及设置排序数组,然后遍历数组:对于每个奇数元素,我会添加该整数,而对于每个偶数元素,我会减去该整数;最终的总和就是答案,因为其他整数会被抵消。
然而,我发现一个更有效的解决方案是简单地对每个元素执行异或操作--甚至不需要排序数组!也就是说:
2^3^5^2^5^5^3 = 5
我回忆起我上离散结构课时学到的异或运算具有结合律,并且这就是为什么这个解决方案可行的原因:
a^a = 0
并且:
a^a^a = a
虽然我记得联想律适用于异或运算,但是我很难找到一种特定于异或的逻辑证明(大多数互联网上的逻辑证明似乎更专注于AND和OR操作)。有人知道为什么联想律适用于异或运算吗?
我猜这涉及一个包含AND和/或OR的异或恒等式。
a xor b = ¬((a and b) or (¬a and ¬b))
来证明XOR的结合律。 - harold