码迷,mamicode.com
首页 > 其他好文 > 详细

寻找水王程序一

时间:2016-05-16 19:49:47      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:

题目 :

信息学院的论坛里面,有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。风闻该“水王”发帖数目超过了帖子总数的一半。

如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能怎么样找出这个传说中的Tango水王吗?

思路:

我开始想到的思路是:

可以假设帖子的第一个ID是次数最大的。 遍历下一个ID,如果跟第一个一样,就++,否则,遇到一个不是水王发的帖子,将这个帖子与水王发的一个帖子删掉,也就是--,如果 == 0,那么说明当前的候选不是水王,假设下一个是新的水王。遍历结束,剩下就是水王ID,他是获胜者。 

 

按老师的思路:

每次抵消两个相邻的ID,不管删除的ID是否包含“水王”的ID,在剩下的ID列表中,“水王”ID出现的次数仍然超过总数的一半。可以通过不断重复这个过程,把ID列表中的ID总数降低(转化为更小的问题),从而得到问题的答案。总的时间复杂度只有(N),且只需要常数的额外内存。

 

 

#include <iostream>
using namespace std;

typedef int Type;

Type find (Type *a, int N)
{
	Type sw;
	int i, nTimes;
	for (i = nTimes = 0; i < N; i++)
	{
		if (0 == nTimes)
		{
		    sw  = a[i];
			nTimes = 1;
		}
		else
		{
			if (sw == a[i])
			{
				nTimes++;
			}
			else
			{
				nTimes--;
			}
		}
	}
	return sw;
} 


int main()
{   
	int sw;
	Type arr[] = {4, 5, 4, 4, 4, 5, 0, 2, 4, 2, 4, 4};
	sw=find(arr,12);
    cout<<"水王是:"<<sw;
	return 0;
}

 

 技术分享

 

寻找水王程序一

标签:

原文地址:http://www.cnblogs.com/tyyhph/p/5498807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!