• 课堂练习_查找水王


    题目:

    三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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为水王,所以这个还需要加上一些限制和判断。

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

  • 相关阅读:
    排列组合
    从$a_n=f(n)$的角度理解数列中的表达式$a_{n+1}=frac{k}{a_n}$
    洛必达法则的应用
    三角函数专题
    和差角公式的证明
    利用导数证明不等式
    常用数学模型整理
    教给学生知识的本源
    争鸣|两个易混概率题
    es6数组的复制
  • 原文地址:https://www.cnblogs.com/flw0322/p/10982054.html
Copyright © 2020-2023  润新知