对一道微软面试题的思考

文章探讨了一道微软面试题的两种解法,包括扫描计数和使用9个数组标记的方法。通过对概率的分析,作者论证了在大多数情况下,只需要扫描一小部分序列就能找到出现两次的数字,从而支持了复杂度较低的解决方案。
摘要由CSDN通过智能技术生成

在论坛上,我看到大家在讨论一道微软面试题: 有100万个数字(1到9),其中只有1个数字重复2次,如何快速找出该数字。大家讨论的很激烈,也给出了很多的算法。

lthyxy同学的算法是:扫描一遍做计数,然后看那个数的计数器是2。程序如下:

int num[10] = {0};
for(int i = 0; i<1000000;++i) //a[i]就是你那些数 
	num[a[i]]++;
for(int i = 1; i <= 9; ++i)
	if(num[i] == 2) 
		cout << i << endl; 

jernymy同学的算法复杂一些:定义9个数组,记录1-9的出现的数字做标记,出现一次则,对应数组加1, 超过2次,在下次循环直接结束,这样一共直到记录8个数字后,直接打印第9个数字,就是一共只会出现2次的数字了。程序请看他的博客:http://blog.csdn.net/jernymy/article/details/6639534#reply


经过一番分析,我发现jernymy同学的算法是正确的。因为100万相对于1到9来说,是个非常巨大的数字。从概率的角度来分析,很有可能在扫描到1000个数的时候,就会发现有8个数字的重复次数都超过2,因此剩下的那个数字就是需要查找的那个数。具体概率分析如下:

假定9这个数字只重复2次,而且还不在这前1000个数里面,那么剩下的1到8这8个数字,重复的次数有一个不超过2的概率是:

1. 总的概率是:8的1000次方。

2. 8个数字中有一个不超过2的概率:

     1)该数字没有出现:7的1000次方

     2)该数字出现一次:1000×7的999次方,约等于1000×7的1000次方

     3)该数字出现两次:1000×999×7的998次方,约等于1000×999×7的1000次方

     合计大约等于:1000×1000×7的1000次方

     因为有8个数,因此总的数是:8×1000×1000×7的1000次方

3. 计算出来的概率是:(8×1000×1000×7的1000次方)/(8的1000次方)约等于8.15e-52。

可以看出,在扫描到1000数的时候,出现8个数字中有一个数字重复不超过两次的概率大约为8.15e-52,这个概率也太低了。也就是说,在绝大部分情况下,不用扫描1000个数,就可以得出结论了,根本就不需要扫描100万次。这也是我赞同jernymy同学的算法的主要原因。


评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值