找水王问题

设计思路

  起初看到这道题第一个想法就是先排序再找出最中间一个ID,但是老师要求时间复杂度是o(n),所以这个思路被放弃。

  高长志同学提出了另一种思路。由于水王的ID出现的次数占总数的一半,所以从头遍历一遍,先存入第一个ID,依次与后面的ID比较,遇到相同的ID,计数器加1;遇到不同的ID,计数器减1,当计数器等于0时,证明前面出现的ID都是成对的,而且可以同时消去,再存入当前的ID,依次循环。循环到最后剩下的ID就是水王。

源程序代码

 1 #include <iostream>
 2 using namespace std;
 3 
 4 void main()
 5 {
 6     int biao[10],i;
 7     cout<<"请输入ID列表:";
 8     for (i=0;i<10;i++)
 9     {
10         cin>>biao[i];
11     }
12     int a=0,n=0;
13     for (i=0;i<10;i++)
14     {
15         if (n==0)
16         {
17             a=biao[i];
18             n=1;
19         }
20         else
21         {
22             if (a==biao[i])
23             {
24                 n=n+1;
25             }
26             else
27                 n=n-1;
28         }
29     }
30     cout<<"水王是:"<<a<<endl;
31 }

运行结果截图

编程总结

  这个问题要求编程者换一种不同的思路,不能用平常的思路来思考。不同的题目适合不同的数学模型,多培养发散式思维,不能固守一种想法。

原文地址:https://www.cnblogs.com/BUANG/p/4507587.html