查找序列中缺少的数字[重复]
Posted
技术标签:
【中文标题】查找序列中缺少的数字[重复]【英文标题】:Finding the number missing in the sequence [duplicate] 【发布时间】:2013-08-22 12:51:42 【问题描述】:我得到了一个包含 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 是如何在上述情况下找到丢失的整数的?
【问题讨论】:
暴力破解怎么样?对数组进行排序,检查[n - (n-1)]
不等于1 的几个索引。
为什么有最大允许整数?
@VoronoiPotato:如果序列中有 10 亿个数字并且他被限制为 32 位整数怎么办?
@Renan 因为那更慢?无论如何,OP 并没有要求替代解决方案,而是要求提出的解决方案为何/如何工作。
【参考方案1】:
要回答你的问题,你只需要记住这一点
A XOR B = C => C XOR A = B
紧接着就是
(PARTIAL SUM) XOR (MISSING ELEMENT) = (TOTAL) =>
(TOTAL) XOR ( PATIAL SUM) = (MISSING ELEMNT)
要证明第一个性质,只需写下异或真值表:
A B | A XOR B
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 0
简而言之真值表:如果两个位相同,则异或结果为假,否则为真。
顺便说一句,XOR 的这一特性使其成为简单(但并非微不足道)加密形式的不错选择。
【讨论】:
【参考方案2】:首先,即使存在整数溢出,您也可以使您的原始方法工作(只要n
适合int
)。
关于 XOR 方法,请注意 R1 xor M == R2
(其中 M
是缺失的数字)。由此得出R1 xor M xor R2 == 0
,因此M == R1 xor R2
。
【讨论】:
【参考方案3】:XOR
之所以有效,是因为每次您将XOR
与1
翻转一次,每次您将XOR
与0
一起翻转时,它都保持不变。因此,XOR
ing 所有数据保存缺失数字的结果给您带来XOR
ing 所有数字的“负面”印象。 XOR
这两个一起恢复你丢失的号码。
【讨论】:
【参考方案4】:让我们只看一下低位 (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 是独立计算的,逐位计算。
【讨论】:
以上是关于查找序列中缺少的数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章