题目要求:
有3个发帖很多的ID,他们的 数目都超过了 总数目N的1/4。你能从 ID列表中快速找出他们的ID。
设计思路:
综合前一个超级水王综合来看,它们的共同之处就是水王帖子数与总数的关系,从这一关系入手,就有希望找到较为简单的算法。
上一次的一个好做,这一次的三次同样寻找过程中不变还是设置计数并与0做比较。
较为难做的是设初值的情况:我的办法就是先设一个水王,剩下的两个在按数组顺序的情况下最先出现与已知水王ID不同设为剩下的水王。
具体实现:
#include<iostream> #include<string> #define M 20 using namespace std; void main() { int n, i, count[3] = {1,0,0}; string ID[M], water[3]; cout << "输入帖子总数:" << endl; cin >> n; cout << "按顺序依次输入ID:" << endl; for (i = 0; i < n; i++) { cin >> ID[i]; } cout << "帖子表为:" << endl; cout << "序号" << ' ' << "ID" << endl; for (i = 0; i < n; i++) { cout << i << ' ' << ID[i] << endl; } //count[3] = { 1,0,0 }; water[0] = ID[0]; for (i = 0; i < n; i++) { if (count[1] == 0 && ID[i] != water[0] && ID[i] != water[2] ) { count[1]++; water[1] = ID[i]; } else if (count[2] == 0 && ID[i] != water[1] && ID[i] != water[0]) { count[2]++; water[2] = ID[i]; } else if (ID[i] == water[0]) count[0]++; else if (ID[i] == water[1]) count[1]++; else if (ID[i] == water[2]) count[2]++; else if (ID[i] != water[0] && ID[i] != water[1] && ID[i] != water[2]) { count[0]--; if (count[0] < 0) water[0] = ID[i]; count[1]--; if (count[1] < 0) water[1] = ID[i]; count[2]--; if (count[2] < 0) water[2] = ID[i]; } } cout << "三个小水王分别对应的ID为:" << endl; cout << water[0] << "、" << water[1] << "、" << water[2] << endl; }
实验结果: