我得到了一个n个整数的列表,这些整数的范围是1到n。列表中没有重复项。但是列表中缺少其中一个整数。我必须找到缺少的整数。
Example: If n=8
I/P [7,2,6,5,3,1,8]
O/P 4
I am using a simple concept to find the missing number which is to get the
sum of numbers
total = n*(n+1)/2
And then Subtract all the numbers from sum.
但如果数字的总和超出允许的最大整数,则上述方法将失败。
所以我搜索了第二个解决方案,我找到了一个方法如下:
1) XOR all the elements present in arr[], let the result of XOR be R1.
2) XOR all numbers from 1 to n, let XOR be R2.
3) XOR of R1 and R2 gives the missing number.
这种方法是如何工作的?在上述情况下,R1和R2的XOR如何找到缺失的整数?
答案 0 :(得分:28)
要回答你的问题,你只需要记住
A XOR B = C => C XOR A = B
紧接着
(PARTIAL SUM) XOR (MISSING ELEMENT) = (TOTAL) =>
(TOTAL) XOR ( PATIAL SUM) = (MISSING ELEMNT)
要证明第一个属性,只需写下XOR真值表:
A B | A XOR B
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
简单表:如果两个位都相同,则XOR的结果为false,否则为true。
在一个不相关的说明中,XOR的这个属性使它成为简单(但不是微不足道)加密形式的理想选择。
答案 1 :(得分:4)
首先,即使存在整数溢出,您也可以使原始方法正常工作(只要n
适合int
)。
关于XOR方法,请注意R1 xor M == R2
(其中M
是缺失的数字)。由此得出R1 xor M xor R2 == 0
,因此M == R1 xor R2
。
答案 2 :(得分:4)
XOR
有效,因为每当XOR
1
XOR
翻转它时,每当0
XOR
XOR
时,它都会停留相同。因此,XOR
所有数据的结果可以保存丢失的数字,从而为您提供{{1}}所有数字的“负面”印象。 {{1}}将这两者合在一起可以恢复丢失的数字。
答案 3 :(得分:1)
让我们看一下低阶位(LOB)的XOR,以保持简单。设x是缺失的整数。
列表中的每个整数对R1的LOB(LOB(R1))贡献1或0。
该范围内的每个整数对LOB(R2)贡献1或0。
现在假设LOB(R1)== LOB(R2)。由于R2 == R2 XOR x,这只有在LOB(x)== 0 == LOB(R1)XOR LOB(R2)时才会发生。 (1 xor 1 = 0,0 xor 0 = 0)
或者假设(LOB(R1)== LOB(R2)。这只有在LOB(x)== 1 == LOB(R1)XOR LOB(R2)(1 xor 0 = 1,0 xor 1)时才会发生= 1)。
但是对低阶位有效的方法适用于所有这些,因为XOR是逐位独立计算的。