课堂练习_查找水王

题目:

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

设计思想:

1)最简单的一种思想就是用类对象存储,然后逐一进行统计,不过这个算法时间复杂度O^n2

2)课上经过同学分享和老师讲解,有另一种方式解决问题,主要抓住字眼,水王发帖数目超过一半,主要针对这句话进行处理。从第一个开始进行两两比较,水王肯定是最多的那个,所以通过比较,相同则数目加一,不同则将两个同时删除,最后剩下的肯定是水王。

代码:

法一:

 1 package com.king.demo;
 2 //只是实现功能的算法,数据库连接以及数据库操作函数,javabean没在
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import com.king.Dao.Dao;
 7 import com.king.bean.bean;
 8 import com.king.bean.count;
 9 
10 public class king {
11     
12     @SuppressWarnings("unlikely-arg-type")
13     public static void main(String[] args) {
14         // TODO 自动生成的方法存根
15         Dao dao = new Dao();
16         List<count> array = new ArrayList<>(); 
17         List<bean> list = new ArrayList<>();
18         list = dao.list();
19         int k = 0;
20         int time = 0;
21         for(int i = 1;i<list.size()-1;i++)
22         {
23             if(list.get(i).getIDofk().equals(list.get(i+1).getIDofk()))
24             {
25                 time++;
26             }
27         }
28         for(int i=0;i<list.size();i++) 
29         {
30             if(!array.contains(list.get(i).getIDofk())){
31                 count count = new count(list.get(i).getIDofk(),0);
32                 array.add(count);
33             }
34             for(int j = 0;j<array.size();j++) {
35                 if(list.get(i).getIDofk().equals(array.get(j).getIDofk())) {
36                     int time = array.get(j).getTime();
37                     time++;
38                     array.get(j).setTime(time);
39                 }
40             }
41         }
42         int max = 0;
43         for(int k=0;k<array.size();k++) {
44             if(array.get(max).getTime()<array.get(k).getTime()) 
45             {
46                 max = k;
47             }
48         }
49         if(array.get(max).getTime() >= list.size()/2) {
50             System.out.println("水王:" + array.get(max).getIDofk()+"   总共"+array.get(max).getTime());
51         }
52         System.out.println(array.get(max).getIDofk()+"   总共"+array.get(max).getTime());
53     }
54 
55 }

 

法二:

package shui;
import java.util.*;
public class test {
    public static  void main(String args[]){
        Scanner sc =new Scanner(System.in);
         
        System.out.println("请输入ID的个数:");
        int a=sc.nextInt();
        int b[]=new int[a];
        System.out.println("请输入ID");
        for(int i=0;i<a;i++)
        {
            b[i]=sc.nextInt();
        }
         
        int water=b[0];
        int k=1;
        for(int i=1;i<a;i++)
        {
            if(water!=b[i])
            {
                k=k-1;
                if(k<=0)
                {
                    water=b[i+1];
                    k=1;
                    i++;
                }
            }
            else
            {
                water=b[i];
                k=k+1;
            }
        }
         
        System.out.println("水王为"+water);
    }
}

 

反思: 

下课后回到宿舍自己针对课上的想法又进行了测试,发现这个有些bug,假设只有5个回复,其中ID定为:1.2.2.3.4,这样就最后的id=4为水王,所以这个还需要加上一些限制和判断。

后期对代码还需进行调试、修改。

posted @ 2019-06-02 21:32  枫黎  阅读(153)  评论(0编辑  收藏  举报