UNIN队设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
思路:最初任务直接记录每个ID的发帖量。但是这么简单老师也就不用提问了。后来又考虑如果一个人帖子过半的话,随机取100次ID,100次中取到次数最频繁的就是水王,这个方法我个人觉得非常好,当然他是有错误可能的,并且可以通过概率论相关知识计算。最后经老师点拨,这道曾经的面试题终于得出答案。通过“删帖”的方式,水王发帖数目超过了帖子数目的一半,我们从列表头开始匹配,每匹配到一个不一样的就把俩帖子都删了,遇到一样的就删一个留一个。那么一定可以得到海王
c语言代码如下
#include<iostream>
#include<string>
#define N 10
using namespace std;
int main()
{
string king;
//定义列表
string IdList[N]={"2","3","1","3","1","1","7","1","2","3"};
int i=0;
int num=1;
king=IdList[0];
for(i=1;i<N;i++) {
//如果当前id和king id不同
if(IdList[i]!=king)
{
//num-1
num=num-1;
//num为0,将下一个id 设为 king,并直接跳过下一次循环,并将 num设为1
//若num不为0,king 不变
if(num==0)
{
king=IdList[i+1];
i=i+1;
num=1;
}
}
//若id和king id相同,num+1
else
{
king=IdList[i];
num=num+1;
}
}
cout<<"要找的水王的 id 为:"<<king<<endl;
return 0;
}