题目

  三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

一、设计思路

  要求尽可能少的使用变量,且时间复杂度为O(n)。

  一个变量保存ID,有一个变量来计数,当前保存的ID与此循环中的ID比较,根据相同与否自加或自减,因为“水王”的ID是大于n/2的,随意在两两相邻的比较中,到最后,“水王”肯定是优势于其他ID,即最后保存的就是“水王”的ID,且计数变量>=0。

  这个程序使用了3个变量,“i”来控制循环,“n”来计数,初始为0,“m_ID”负责记录ID,初始为啊a[0]。在一次循环中,如果当前ID与m_ID中保存ID相同则n自加,否则自减,当自加,自减结束后,判断当前n是否<0,如果<0则重新初始n为0,m_ID为当前ID。

二、代码

 1 //刘双渤,2015年5月18,水王问题 
 2 #include <iostream>
 3 using namespace std;
 4 
 5 void main()
 6 {
 7     int a[10] = {2,1,3,1,5,1,1,1,1,9};
 8     int n,m_ID;
 9 
10     n = 0;
11     m_ID = a[0];
12 
13     for(int i = 1;i <10;i++)
14     {
15         if(a[i] == m_ID)
16         {
17             n += 1;
18         }
19         else
20         {
21             n -= 1 ;
22         }
23         if(n < 0)
24         {
25             n = 0;
26             m_ID = a[i];
27         }
28     }
29 
30     cout<<"帖子ID顺序为:";
31     for(int i = 0;i <10;i++)
32     {
33         cout<<a[i]<<" ";
34     }
35     cout<<endl;
36 
37     cout<<"水王就是:"<<m_ID<<endl;
38 }
View Code

相关文章: