课堂练习之找水王

一、问题描述

    三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,
  他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
    如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
二、设计思路
    因为由题知,水网的发帖量超过了总发帖量的一半,所以将所有id找出来的排列形式有两种可能,一种是,水王的id一直没有连续,中间被中断,在这种情况下,水王的id一定在第一个和最后一个,第二种情况,水王的id要相邻,方法就是,先将第一个id设为水王,再将与后面的id进行比较,如果相等,就让一个计数器加一,否则就让下一个id设为水王,这样就将出现次数最多的id找出来了。
三、实验代码
 1 class ZSW 
 2 {
 3     public static void main(String[] args) 
 4     {
 5         //int[] arr = {5,1,5,23,5,4,5,6,5,7,5};//水王id不相邻
 6         int[] arr = {15,5,23,5,5,5,4,5,6,5,7,5};
 7         int c = 0;  
 8         int sw = 0;
 9         for(int i=0;i<arr.length;i++)
10         {
11             if(c==0)                
12             {
13                 sw=arr[i];            
14                 c++;
15             }
16             else
17             {
18                 if(sw==arr[i])        //如果预设的水王id与当前id相同,
19                     c++;            //计数器就加一
20                 else
21                     c--;  //如果不相等,当减到0的时候,就将当前的id作为水王
22             }
23         }        
24         System.out.println(sw);//就将出现次数最多的id输出
25     }
26 }

四、实验截图

五、心得体会
 找水王这道例子,是一道很典型的例子,有很多的解题思路,最好想的就是将所有id都按顺序排列起来,借助水王的发帖量
 是超过一半的,因此二分之一处一定是水王,但是在课堂上,老师的意思是,不能用排序,只用一次遍历,就将水王找出来
 ,先将第一个id设为水王,再将与后面的id进行比较,如果相等,就让一个计数器加一,否则就让下一个id设为水王,这就是典型的匹配计数问题,

让出现次数最多的那个id返回出来。

posted @ 2015-04-23 19:32  Gjianhao  阅读(171)  评论(0编辑  收藏  举报