1,题目:
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
2,思路:
因为风闻该“水王”发帖数目超过了帖子数目的一半,每次从列表中删除两个不同的ID,那么剩下的ID列表中,“水王”的ID出现次数仍然超过剩余数目的一半,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。所以所有帖子从第一个帖子开始遍历,定义一个计数变量b,第二个帖子与第一个帖子相比较,如果相同则b+1;如果不相同则b-1。
3,代码:
#include<iostream> using namespace std; int find(int* p, int n) { int a = 0,b=0; for (int i = 0; i < n; ++i) { if (a == 0 || b == 0) { a = p[i]; b++; } else if (p[i] == a) b++; else b--; } return a; } int main() { int i = 0, n, m[100]; cout << "输入帖子数目:"; cin >> n; cout << "输入所有帖子ID:"; for (i = 0; i < n; i++) { cin >> m[i]; } int k = find(m, n); cout << "水王的ID是:"<<k<<endl; return 0; }
4,截图:
5,总结:
一个项目往往有很多要求,我们在思考项目的实现的同时,也要考虑O(n)的最简单方法。
我们往往执着于第一直觉的被禁锢住思想的解决方法,比如这道题我一开始的思路是分别计数所有的ID,完全没想到现在的这个思路。所以发散和开拓思维很重要。