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