标签:
题目背景:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?int Find(int *arr,int lenght)
{
int Candidate;
int nTimes,i;
for(i=nTimes=0;i<lenght;i++)
{
if(0==nTimes)
{
Candidate=arr[i];
nTimes=1;
}
else
{
if(Candidate==arr[i])
nTimes++;
else
nTimes--;
}
}
return Candidate;//Candidate一定是最后nTimes为1的数字;
}扩展问题:随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?int candidate[3];
void Find(int* arr, int lenght,int *candidate)
{
int nTimes[3];
nTimes[0]=nTimes[1]=nTimes[2]=0; //次数初始化为0
candidate[0]=candidate[1]=candidate[2]=0; //代表三个水王;
for(int i = 0; i < length; i++)
{
if(arr[i]==candidate[0])
{
nTimes[0]++;
}
else if(arr[i]==candidate[1])
{
nTimes[1]++;
}
else if(arr[i]==candidate[2])
{
nTimes[2]++;
}
else if(nTimes[0]==0)
{
nTimes[0]=1;
candidate[0]=arr[i];
}
else if(nTimes[1]==0)
{
nTimes[1]=1;
candidate[1]=arr[i];
}
else if(nTimes[2]==0)
{
nTimes[2]=1;
candidate[2]=arr[i];
}
else
{
nTimes[0]--;
nTimes[1]--;
nTimes[2]--;
}
}
return;
} 因为只需要找出“水王”,所以思想和上面一样。
标签:
原文地址:http://blog.csdn.net/gogokongyin/article/details/51871730