寻找大水王01

题目:
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

设计思路:

输入发帖ID记录表,从第一个ID开始,与后续的发帖ID进行比较,若相同计数器则加一,否则减一。若计数器的数值被减为零,则重新选取当前ID开始记录比较。并且每次在相同的情况下,记录相同数的个数,同时输出结果的时候进行判断,是否有水王。最后并输出结果。

源代码:

#include<iostream>
using namespace std;

int find(int ID[], int n)
{
	int nTimes = 0, i, candidate;

	for (i = 0; i < n; i++)
	{
		if (nTimes == 0)
		{
			candidate = ID[i];
			nTimes = 1;
		}
		else
		{
			if (candidate == ID[i])
			{
				nTimes++;
			}
			else
			{
				nTimes--;
			}
		}
	}
	return candidate;
}

int main()
{
	int i=0;
	cout << "输入12个ID:";
	int arr[12];
	for (i = 0; i < 12; i++)
	{
		cin >> arr[i];
	}
	printf("水王是 %d\n", find(arr, 12));
	system("pause");
	return 0;
}

  

设计思路:每次删除两个不同的ID(不管是否包含“水王”的ID),那么“水王”的ID出现次数仍然超过总数的一半,不断重复这个过程,时间复杂度O(n) 

运行结果:

 

posted @ 2016-05-19 19:43  阿斯蒂芬幻影  阅读(111)  评论(0)    收藏  举报