缺失的数字

来源:互联网 发布:淘宝购物车结算是灰的 编辑:程序博客网 时间:2024/05/16 10:22

记得从《编程之美:微软技术面试心得》看到过一道类似的题目,不过,题目意思写的实在晦涩难懂,好多潜在的条件没有说清楚,让人题目看了无法下手。

假如有一个数组nArray[N],如果数组中的每一个元素满足从数组nArray[i]<=(N),且数组中的每一个数互不相同,请找出(0~N)范围内,缺失的那个数字。

不难得出,由于(0~N)的总和 total 是固定的,只要对数组进行累加求和得到sum,那么total-sum就是缺失的数字。目前为止,这里仅仅是个引子,下面才到了重点。

思考1:

假如数组nArray中,只有一个数字出现的次数是奇数次,其他数字出现的次数是偶数次,那么如何得到这个数字呢。

偶数字很容易让人想到异或运算, B = A XOR B XOR A,通过将整个数组异或,可以得到那个出现次数为奇数的数字。

思考2:

假设数组nArray[2*N]数组中,nArray[i]<N,[0,N-1]中的每一个数字出现的次数都是两次。现在随机抽掉数组中的两个的数字,如何找出这两个数字(A和B)?

这里要分两种情况,如果这两个数字是相同(A=B),那么这个数组的异或的结果还是为0,只需要对数组求和可以得到缺失的数字。

如果两个数字是不同的话(A!=B),那么首先根据求和可以得到  A+B 的结果C,然后通过对数组进行异或得到 A 和 B的异或D,

对A进行枚举,根据前面得到D可以得到 ,B1 = A1 XOR D,只要验证 A1+B1 = C即可

差的情况下面,在时间复杂度为O(n)下可以得到正确结果。也可以根据C,D进行适当剪枝和优化,这里就不继续探讨下去。整个流程如下图所示

 

image
0 0
原创粉丝点击