4月21号周二课堂练习:找水王

一、题目要求

三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
 
二、设计思路
 
论坛中有多少帖子,有多少个ID都是不清楚的。我们采用类似于消消乐的方法进行处理,具体方法如下:将所有的帖子进行遍历,比较两个帖子的ID。如果两个帖子的ID相同,则将两个帖子丢弃。再进行下次比较,直到剩余的帖子中的ID只有一种,将此ID输出,即为要找的“水王”。
 
三、程序源代码
#include<iostream>

using namespace std;

int curId=0;//当前灌水id

int idNum=0;//当前灌水id的数量



void deal(int arr[],int n)

{

	for (int i=0;i<n;i++)  

	{  

		if (idNum==0) //当前灌水的id数量变为0或者抵消成为了0

		{  

			idNum++;//灌水帖子数量+1

			curId=arr[i];//用curId记录当前灌水Id

		}  

		else  

		{  

			if(curId==arr[i])//如果新的灌水帖子与当前帖子Id相同则Id数量+1

				idNum++;  

			else  //如果不同,则抵消一个当前Id      

				idNum--; 

		}  

	}  

}  

void main()

{

	int i;

	int count=0;//记录水王的帖子数量

	int n;//灌水帖子数

	int * arr=new int[n];

	cout<<"请输入灌水帖子数:";

	cin>>n;

	cout<<"输入每个灌水帖子id:"<<endl;

	for(i=0;i<n;i++)

	{

		cin>>arr[i];

	}

	deal(arr,n);

	for(i=0;i<n;i++)

	{

		if(arr[i]==curId)

		{

			count++;

		}

	}

	cout<<"\"水王\"Id是:";

	cout<<curId<<endl;

	cout<<"水贴数量为:";

	cout<<count<<endl;

}

 

四、运行截图

当ID是数字时可以正常处理

4月21号周二课堂练习:找水王

当ID是字母或字符时会出现如下错误

4月21号周二课堂练习:找水王

 

五、实验总结

实验做完之后还有很多的后续工作要做,算法优化和灌水帖的ID都是要解决的问题。仔细分析后会发现,题目说了一大堆的废话,其实给我们传达的就只有三点信息,1、求一个数组的最大值;2、最大值大于数组所有数和的一半;3、找到这个最大值并将数组的位置输出(即ID)。这题的难点主要是在算法的时间复杂度上。本题还有待改进在时间复杂度和 帖子的id处理上面。

你可能感兴趣的:(4月21号周二课堂练习:找水王)