对于包含从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的值,这将很有帮助。
答案 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
包含或x
或y
(此处参与的所有其他项目都是配对的),我们可以用
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