题目要求:
有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 << "序号" << '\t' << "ID" << endl;
for (i = 0; i < n; i++)
{
cout << i << '\t' << 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;
}
实验结果: