题目要求:

      有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;
    
}

实验结果:

小水王_i++

 

 

小水王_#include_02

小水王_i++_03