标签:
题目背景: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