天天看点

课堂练习-找水王

一、题目及题目要求

题目:三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。

如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?

二、设计思路:

1、把帖子列表,抽象为一个一维数组arr[NUM],输入长度length为id总数,每个数组元素为一个id。

2、再设置一个循环,按照顺序来依次两两比较,如果作者id相同则保留,如果作者id不同则消除。

3、最后剩下id即为水王id

三、源程序:

#include<iostream>
using namespace std;
#define NUM 100
 int find(int arr[], int n)//找水王函数
 {
    int sw = 0; //
    int count=0;  //标记
    for(int i=0;i<n;i++)
    { 
        if(count == 0)//初始时,把数组第一个元素赋给sw
        { 
            sw = arr[i]; 
            count = 1; 
        } 
        else
        { 
            if(sw == arr[i]) //相等不消除
                count ++; 
            else  
                count --; 
        } 
    }

         return sw;
    }
int main()
{
	  int length=0;
      while (length==NULL||length == 0)//如果数组长度为空或零则请重新输入
      {
        cout<<"请输入ID数量:";
        cin>>length;
       }
       int arr[NUM];
       cout<<"输入作者id(不为0):"<<endl;
	   for(int i=0;i<=(length-1);i++)
	   {
		   cin>>arr[i];
		   if(arr[i]==0)
		   {
			   cout<<"id不为0,请重新输入:";
		   cin>>arr[i];
		   }

	   }

	   int ID=find(arr,length);
		cout<<"水军的ID是"<<ID<<endl;
		return 0;
}
      

四、运行截图

课堂练习-找水王
课堂练习-找水王
课堂练习-找水王

五、项目计划日志

周活动总结表

姓名:魏**                  日期2016.5.19

日期   任务 听课  编写程序 阅读课本 准备考试 日总计
周一 100 30 130
周三
周四
周总结 60 260

阶段时间和效率                                            周数(上一次周活动表的周数+1):

不包括上一周在内的累计时间      

总计  100  60  260
平均
最大
最小

 以前各周的累计时间      

  60

六、时间记录表:

学生       魏**                                           日期   2016年5月19日 

教师        王**                                          课程        软件工程      

日期 开始时间 结束时间 中断时间 净时间 活动 备注
 5.16  14:30 16;20  10  上课
 18:30  19:00  无 看书
 5.18 22:00 22:30
 5.19 14:30 16:30 作业

七、个人总结

这个题目,一开始没有思路,在老师的启发下一开始到的是遍历列表,统计每个id出现的次数。后来老师提到了遍历然后排序,中间项肯定是水王ID,可是时间复杂度为n*n,为了降低时间复杂度,老师提示用两两消除的思想,后来我们就想到了如何解决。一道题目有好多种解法,我们应当拓宽思路,多看一些算法书籍,多练习写程序,孰能生巧。

继续阅读