查找给定数组中的重复和遗漏数字

时间:2019-04-16 00:34:21

标签: arrays algorithm xor

对于包含从1到N的数字的给定数组A,我想找到重复且缺失的一对数字(x,y)。范例A = [1、3、3],则x = 3,y = 2。

虽然我知道可以通过服用 https://stackoverflow.com/a/5767648/5031518这里提到的异或方法。 我无法理解解决方案的最后一部分,其中通过基于设置的位拆分数组从x ^ y中提取x和y的值。

如果有人可以解释为什么两个列表的异或分别导致x和y的值,这将很有帮助。

1 个答案:

答案 0 :(得分:1)

在第一阶段,您将计算整个范围1..N并在列表中的值的异或

1  2  3 .. x .. N  
1  2  3 ..   .. N  y

所有配对项目的异或为0,因此结果为p = x xor y

p非零,但是设置了哪些位?那些x和y不同。

因此,我们可以从p中找到任意1位,将其称为mask,并对值1..N和您的列表执行相同的过程,仅选择设置了该位的值< / p>

for all v in 1..N and in list:   
   if ((v & mask) == mask):
       newxor ^= v

毕竟,newxor包含或xy(此处参与的所有其他项目都是配对的),我们可以用

找到另一个项目
 xy = p ^ newxor

注意:我们无法区分重复的项目和遗漏的项目,只需将它们配对即可。

以您的示例

p = 1^2^3^1^3^3 = 1 = 001 binary

使用掩码001b的重复过程仅包含奇数

 newxor = (1 xor 3) xor (1 xor 3 xor 3) = 3

其余号码是

 3 xor 1 = 2

例如(1,2,2),我们得到相同的p

p = 1^2^3^1^2^2 = 1 = 001 binary

和相同的newxor = 3和相同的休息值xy=2