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