我遇到了一个常见的编程面试问题:给定一个无符号整数列表,找到一个在列表中出现奇数次的整数。例如,如果给定列表:
{2,3,5,2,5,5,3}
解决方案将是整数 5,因为它在列表中出现 3 次,而其他整数出现偶数次。
我最初的解决方案涉及设置一个排序数组,然后遍历数组:对于每个奇数元素,我将添加整数,而对于每个偶数元素,我将减去;最后的总和是解决方案,因为其他整数会抵消。
但是,我发现通过简单地对每个元素执行 XOR 来实现更有效的解决方案——您甚至不需要排序数组!也就是说:
2^3^5^2^5^5^3 = 5
我从离散结构类中回忆起,关联属性适用于 XOR 操作,这就是该解决方案有效的原因:
a^a = 0
和:
a^a^a = a
虽然我记得 Associative Property 适用于 XOR,但我很难找到 XOR 特定属性的逻辑证明(互联网上的大多数逻辑证明似乎更侧重于 AND 和 OR 操作)。有谁知道为什么关联属性适用于 XOR 操作?
我怀疑它涉及包含 AND 和/或 OR 的 XOR 身份。