在重复元素XOR运算符的数组中找到两个非重复元素?

时间:2012-08-07 09:55:39

标签: c algorithm xor

假设我有一个包含2n + 2个元素的数组。数组中的n个元素出现两次,剩下的两个元素是唯一的。你必须在O(n)时间和O(1)空间中解决这个问题。其中一个解决方案是使用XOR。但我无法理解这一点。任何人都可以帮我解决这个问题,还是可以给我更好的解决方案?

问题和解决方案的链接是this

1 个答案:

答案 0 :(得分:10)

首先 - 请注意a xor a == 0,每个a

假设您有两个唯一的数字 - x,y

如果对每个元素执行xor,最终会得到一个等于x xor y的数字(因为每个对偶自身都无效),并且至少有一个“up”位。选择这一位(如果有多于一个,你可以选择哪一位),并将列表拆分为两个子列表:
(1)具有该位的所有数字。
(2)所有未设置此位的数字。

其中一个唯一的数字有这个位,另一个没有(否则 - 它首先不是“up”),所以每个列表中都有一个唯一的数字。

再次迭代每个列表,并对所有元素执行xor,结果是此列表中的唯一编号,因为每个重复对都会使其自身无效。