寻找水王

一、题目要求

三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
要求将设计思想、代码实现、实现截图、个人总结以博文的形式发表。(截止日期2015-4-22晚18:00)
 
二、设计思想
上课时用排序算法将ID表排成有序的,根据水王ID超过总贴数一半,则在有序表中的N/2项一定是水王的ID这一思路可以求出水王iD,此时算法的复杂度为O(n*n),但是老师要求时间复杂度为O(n),因此可以遍历ID表,两两相邻的ID进行比较,若不同则删掉,那么在剩余的ID表中水王的ID号仍然超过总数的一半,不断重复这个过程,把列表中ID总数降低,最后剩下的肯定是水王的ID,这些无序ID号可以用数组arr表示。
三、代码
 
 
#include<iostream.h>
void main()
{
	int arr[11]={1,2,2,3,4,2,2,5,3,2,2};//假设的ID号
	int shuiwang = 0;  
	int count=0;  //标记
	for(int i=0;i<11;i++)
	{  
		if(count == 0)
		{  
			shuiwang = arr[i];  
			count = 1;  
		}  
		else
		{  
			if(shuiwang == arr[i])  
				count ++;  
			else   
				count --;  
		}  
	} 
	cout<<"水王的ID是"<<shuiwang<<endl;
}

  四、截图

五、总结

这次实验题目有个条件就是水王发帖的ID号超过所以ID号一半以上,因此这就是这题的突破点,对于时间复杂度,好的设计思路可以大大降低时间复杂度,比如这题就可以将时间复杂度从O(N*N)降低到O(N)。

posted @ 2015-04-22 17:54  computer有前途  阅读(118)  评论(0编辑  收藏  举报