腾讯的一道面试题

原帖地址:http://topic.csdn.net/u/20111228/16/73A64B36-EDDF-4013-803A-666157808071.html

 

这个题在CSDN上比较火,原题如下:

有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里

请找出丢失的数字,最好能有程序,最好算法比较快

假设n=10000

 

能想到算法就是排序,然后二分查找。虽然再遍历一遍并不会改变算法的复杂度,因为排序需要O(nlgn),但二分可能毕竟要快些。

二分的思路大约是:取中间那个元素,看其和下标的关系,借以确定已经分割的某个部分包含几个缺少的元素,包含0个缺少元素的部分可以直接抛弃。想象一种情况:在二分的过程中,整个数组被分成四份,其中必然有一份是不包含减少了的元素的,而假设其他三个分割都各自只包含一个元素,那么就可以对这三个分割执行真正意义上的二分查找,由于3是一个比较小的数,查找复杂度近似O(lgn)。其他的情况可以一一列举,但应该不会过于复杂。

二分查找的方法是我自己分析的,有完备的分析方法可以指点下~

 

还有一种方法是对所有1到n的数建立一个bitmap或者bool数组,在O(n)复杂度下就可以解决问题。

 

其他解决方法还有,

#5楼,利用数学解方程的方法(高中数学不太好,没怎么看懂)

懒得贴代码了,这个以前写过去掉两个的。时间复杂度o(n),空间复杂度o(1)。
根本不需要排序,但需要解方程。说下去掉两个数的思路

遍历数组,求取数组的累加和s, 平方和qs。
用1...10000的累加和减去s, 得到移除两数之和a,
用1...10000的平方和减去qs,得到移除两数之和b,

那么解方程就可以了
x1 + x2 = a
x1^2 + x2^2 = b

需要用的高中数学中的角坐标变换,和差化积什么的。


至于去掉三个数大家可以试试立方和
x1 + x2 + x3 = a
x1^2 + x2^2 + x3 = b
x1^3 + x2^3 + x3^3 = c
方程大家可以任意构造,只要其和不用太大,并且易于求解就可以了

连续数的平方和可以通过平方和公式计算,是关于n的一个函数,很容易的。
同样的连续数字的累加和也有公司,直接套。

 

#27楼

我也说下我的思路,不知道可行不?
随机选取一个数.
快排第一次排序.
然后遍历一次,就得出来了.
时间效率O(n).

不清楚这个方法到底怎么执行,遍历到底指什么??

 

其实关于这道题的解法,我觉得排序然后二分查找的算法蛮有意思的。虽然效率不如后几种,但很有意思。

你可能感兴趣的:(面试题)