课堂练习之检测水军

一、实验题目与设计思路

1、题目:

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

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

2、设计思路

   首先这个题目有有一个前提就是在总帖数一定的情况下,这些帖子里面有一半以上的帖子都设计到一个ID,这个ID就是水军,为了制止这个水军,就要检测出这个水军,那么我们定义一个数组,数组里面的数字定为水军的ID,在这个数组里面查找出在数组里出现半数以上的这个ID,要求时间复杂度为o(n),意思就是只能有一层for循环,按照老师上课讲的采用消消乐的方式,两个不一样的就消去,因为水军的帖子数超过半数,那么消到最后剩下的就是水军,然后在输出这个水军的ID。

二、源代码

 1 // shuiwang.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "stdio.h"
 6 
 7 
 8 int main(int argc, char* argv[])
 9 {
10     int a[10000];
11     int tiezishu; 
12     int i,j,k=1;
13     int shui;
14     printf("请输入帖子总数:");
15     scanf("%d",&tiezishu);
16     printf("
");
17     for(i=0;i<tiezishu;i++)
18     {
19         printf("
请输入第%d个帖子的ID:",i+1);
20         scanf("%d",&a[i]);
21     }
22     shui=a[0];
23     for(i=1;i<tiezishu;i++)
24     {
25         if(shui!=a[i])
26         {
27             k=k-1;
28             if(k<0)
29             {
30                 shui=a[i+1];
31                 k=1;
32                 i++;
33             }
34         }
35         else
36         {
37             shui=a[i];
38             k=k+1;
39         }
40 
41     }
42     printf("
水王ID是:%d
",shui);
43     return 0;
44 }

三、运行结果截图

 

四、心得体会

每一个题目的设计实现有很多种方法,有笨的方法,有简单的方法,有最优化的方法,也有复杂度比较大的方法,这次老师要求我们用时间复杂度比较低的方法来实现,但是首先我想到的还是最笨的方法来实现,以前对程序的时间复杂度并没有要求,只要能够实现了题目的要求就好了,程序实现了也没有想过优化,但是这次深刻的体会到了,一个好的程序代码精简但是功能强大。话又说回来,一个好的程序设计的难度也是比较高的,但是我们要这样的锻炼下去,我相信慢慢的我们的能力就会提高很大。

原文地址:https://www.cnblogs.com/hanshidiguo/p/4445762.html