天天看点

课堂练习-找水王

      三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。

     要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

解决方法:

     对所面临的问题进行简化,由于“水王”发帖数目超过了帖子数目的一半,由此可以作为突破口,寻找简单的方法,来解决,可以将发帖的ID看成一位数组,简化为,在一位数组中,查找一半以上相同的元素。采用消除法实现,比较简单,即对相邻的不同的元素消除,相同的元素,则不消除,并且对num(计数)加1,最终剩下的元素即为索要查找的元素。

代码:

//找水王
//李妍 20133093
//三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,
//他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
//要求:如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
#include<iostream>
using namespace std;
#define N 100

int main()
{
    int Water_King = 0; //用来标记水王
    int num = 0;  //记录消除后的次数
    int num_tiezi = 0;//记录帖子的数目
    int Tie[N];

    while (num_tiezi == 0)//如果数组长度为零则请重新输入
    {
        cout << "请输入帖子的数目:";
        cout << endl;
        cin >> num_tiezi;
    }
    cout << "输入帖子ID:" << endl;
    for (int i = 0; i <= (num_tiezi - 1); i++)
    {
        cout << "("<<i+1<<"):";
        cin >> Tie[i];
        cout << endl;
        if (Tie[i] == 0)
        {
            cout << "ID不能为0,请重输:";
            cout << "(" << i + 1 << "):";
            cin >> Tie[i];
            cout << endl;
        }

    }
    for (int i = 0; i<num_tiezi; i++)
    {
        if (num == 0)//初始时,把数组第一个元素赋给Water_King,如果num为0,代表前i-1个中元素两两消完,重新赋值
        {
            Water_King = Tie[i];
            num = 1;
        }
        else
        {
            if (Water_King == Tie[i]) //相等不消除
                num++;
            else
                num--;
        }
    }
    cout << "水军的ID是:" << Water_King << endl;
    return 0;
}      

测试结果:

试验总结:该实验解决的方法有很多种,考虑到时间的复杂度,选用该方法,能够将时间复杂度降到最小,同时代码实现起来,也比较简单。同时采用这种方法,能够为以后解决问题,提供了另一种不同的思路。

时间记录日志:

课堂练习-找水王