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.youkuaiyun.com/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同学的算法的主要原因。