一个1~n的自然数的乱序数组,其中缺失了1到n之间的某个数,如何快速找出这个数?
2014-06-11 09:40
1366 查看
昨天在面试中遇到了这个问题:一个1~n的自然数的乱序数组,其中缺失了1到n之间的某个数,如何快速找出这个数?
当n不太大时,可以考虑求和。先算出1~n的所有数的和,然后减去数组中出现的所有自然数的和。时间复杂度为O(n),空间复杂度O(1)。这种方法的缺点是n不能太大,n比较大时,求和容易溢出。
我当时给出的答案是用位图。从头到尾的扫描整个数组,把出现的数相应的位设置为1.然后再扫描位图,找出不为1的那一位,即为要找的数。这种方法的时间复杂度为O(n),空间复杂度为O(n)。
面试官还提示我可以使用异或,当时脑子一团浆糊,没想明白咋用。异或有个很巧妙的地方:同一变量和该变量与另一变量的异或值的异或等于这个变量自身。所以我们可以把1~n的所有数异或,再把数组中出现的所有数异或,然后再把这两个异或的结果异或,最后得到的值即为我们要找的值。这样时间复杂度为O(n),空间复杂度为O(1)。在空间上比第二种方法要好,而且不会出现第一种方法中所说的溢出问题。
当n不太大时,可以考虑求和。先算出1~n的所有数的和,然后减去数组中出现的所有自然数的和。时间复杂度为O(n),空间复杂度O(1)。这种方法的缺点是n不能太大,n比较大时,求和容易溢出。
我当时给出的答案是用位图。从头到尾的扫描整个数组,把出现的数相应的位设置为1.然后再扫描位图,找出不为1的那一位,即为要找的数。这种方法的时间复杂度为O(n),空间复杂度为O(n)。
面试官还提示我可以使用异或,当时脑子一团浆糊,没想明白咋用。异或有个很巧妙的地方:同一变量和该变量与另一变量的异或值的异或等于这个变量自身。所以我们可以把1~n的所有数异或,再把数组中出现的所有数异或,然后再把这两个异或的结果异或,最后得到的值即为我们要找的值。这样时间复杂度为O(n),空间复杂度为O(1)。在空间上比第二种方法要好,而且不会出现第一种方法中所说的溢出问题。
相关文章推荐
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- Java面试题:1-100之间的数,被放在数组a[99]中,有一个数没有包含在其中,用java代码找出这个数
- 1-100之间的数在数组a[99]中,有一个数没在其中,找出这个数
- 数组中所有数都出现了3次,除了其中一个数,找出这个数
- 给有n个数的数组a,其中超过一半的数为一个定值,在不排序,不开额外数组情况下,以最高效的方法找出这个数。
- 给定一个数组,其中只有一个数出现一次,别的数都出现3次,找出这个数
- 数组A包含0到n的所有整数,但其中缺了一个,且数组A里的整数都是用二进制形式存储,求这个缺失的整数
- 如何快速找出一个数组中只出现一次的两个数,其他元素出现两次?保证时间复杂度O(n),空间复杂度O(1)
- 假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(消除 qosrt 快速排序 哈希)
- 用C++编程 输入10个数字,放在一个数组中,找出其中最小的值,输出这个值以及它在数组中的下标
- 一个全是32位整数的大数组,除了其中一个数字出现2次外,其余的数字都出现了3次。如何找出那个只出现了两次的数字?
- 有个数组中有100w个数,其中有一个数重复了50w次,要求找出这个数字
- 如何快速找出一个数组中最大数和第二大数
- 整型数组处理算法(十)给定数组a[n],其中有超过一半的数为一个定值,找出这个数。[2014人人网笔试题]
- 消除原理____假设数组中有一个数字出现的次数超过了数组长度的一半,试编程找出这个数字(qosrt 快速排序 哈希)
- 面试题:在一个数组中有0-99之间的整数101个(数组无序),用高效方法找出其中的唯一的重复元素!
- 12个球,外形相同,其中有一个球重量与其余11球不同,如何使用天平尽量少次数的测量找出这个小球且判别它比正常球轻还是重