微软面试题二——找水王

1.题目:

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

时间复杂度要求是o(n)。

2.题目要点:

    a.帖子总数是已知的,而且从上到下每条帖子的用户是已知的。

    b.“水王”发帖数超过了总帖数的一半。

3.算法思想:

   因为“水王”发帖数是大于总帖数的1/2,所以“水王”发的帖数减去其余贴子的总数肯定是大于0的。ID记录找到的用户id值,m作为计数器。ID初始值为第一条帖子的id值,从第一条帖子开始进行比较,如果id[i]等于ID,m++,反之减一。同时监测m是否小于0,如果小于0,则做以下变化,ID等于当前id的值,m等于0。

4.代码:

#include<iostream>
#include<string>
#define N 10000
using namespace std;

void Input(string id[], int n)
{
    cout<<"请依次输入从上到下每个帖子的用户的ID:"<<endl;
    for(int i=0; i<n; i++)
        cin>>id[i];
}

string search_max(string id[], int n)
{
    int m=0;
    string ID=id[0];
    for(int i=0; i<n; i++)
    {
        if(ID==id[i])
            m++;
        else m--;

        if(m<0)
        {
            ID=id[i];
            m=0;
        }
    }

    return ID;
}

int main ()
{
    string id[N],ID;
    int n;
    cout<<"请输入帖子总数:"<<endl;
    cin>>n;

    Input(id,n);

    ID=search_max(id,n);
    cout<<"水王的ID是: "<<endl;
    cout<<ID<<endl;

    return 0;
}

5.截图

posted @ 2015-05-15 22:59  hy叶子  阅读(200)  评论(0编辑  收藏  举报