问题:
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
解题思路:
最简单的思路是:我们通过遍历寻找每个id出现的次数,然后比较哪个id出现的次数最多,哪个就是水王。但是这样做比较麻烦,运行速度也比较慢。所以,运用一种比较简单的方法,我们知道水王的帖子数超过半数,所以我们可以用相连的两个id进行比较,如果不同则删除这两个id,剩下的最后一个id就是超过半数的那个id
1 #include<iostream> 2 using namespace std; 3 #define N 100 4 int main() 5 { 6 int ID[N];//发帖者ID 7 int i,a,count=0;//计数变量,帖子的数量,设置水王出现次数初始化 8 int water_king; 9 cout << "输入帖子的数量:" << endl; 10 cin >> a; 11 if (a <= 0) 12 { 13 cout << "输入的帖子数量不正确,请重新输入:" << endl; 14 cin >> a; 15 while (a < 0) 16 { 17 cout << "输入的帖子数量不正确,请重新输入:" << endl; 18 cin >> a; 19 } 20 } 21 cout << "输入发帖者id号:" << endl; 22 for (i = 0; i<a; i++) 23 { 24 cin >> ID[i]; 25 } 26 //寻找水王ID过程 27 for (i = 0; i<a; i++)//遍历a次 28 { 29 if (count == 0) //初始时,把数组第一个元素赋给ShuiWang,如果count为0,代表前i-1个中元素两两消完,重新赋值 30 { 31 water_king = ID[i]; 32 count = 1; 33 } 34 else 35 { 36 if (water_king == ID[i])//相同则计数加1,不同则减一 37 { 38 count++; 39 } 40 else 41 count--; 42 } 43 } 44 cout << "水王的id是:" << water_king << endl; 45 return 0; 46 }
测试结果: