今天的课堂练习是关于众数的查找。但是在这个枯燥的算法上,老师提出了一个很有意思而且很贴近我们日常上网生活的情景:有一个网友,他在一个吧里发帖数最多,而且占到了一半以上,
现在给出所有的帖子以及帖主的姓名,现在要求找出这个水帖霸王。
我们观察题目,其实第一想到的就是用二重循环把每个id对应出现的次数全部都算出来,再进行一次比较,求出次数最大值对应的帖主就是水王。但是,这毕竟不是最优的方法,在老师提出复
杂度为n的时候,我瞬间就懵了。以前求众数不都是二重循环嘛,一个循环体难道就能实现?
在我苦思不得其解的时候,老师给出了一个提示:帖数占到了一半以上。在这之前,我明白帖数占到一半以上就一定是发帖最多的用户一定没问题,以为这是两个表达相同意思的条件,但细细
想却不是这样。我用的二重循环只是利用了发帖最多这个条件,然而发帖数一半呢?
最后的得出了解题思路,一次循环两两进行比较,如果相同,则暂且把它定为水王,如果不同,则将这俩剔除。这样比较到最后,剩下的那个未抵消的用户就一定是水王本王。
代码如下:
1 package tieba; 2 3 import java.util.Scanner; 4 5 class tie 6 { 7 private int num; 8 private String id; 9 public tie() {}; 10 public tie(int num,String id) 11 { 12 this.num=num; 13 this.id=id; 14 } 15 public int getNum() { 16 return num; 17 } 18 public void setNum(int num) { 19 this.num = num; 20 } 21 public String getId() { 22 return id; 23 } 24 public void setId(String id) { 25 this.id = id; 26 } 27 28 } 29 public class tiezi { 30 31 public static void main(String[] args) { 32 // TODO 自动生成的方法存根 33 Scanner sc =new Scanner(System.in); 34 35 System.out.println("请输入ID的个数:"); 36 int a=sc.nextInt(); 37 int b[]=new int[a]; 38 System.out.println("请输入ID"); 39 for(int i=0;i<a;i++) 40 { 41 b[i]=sc.nextInt(); 42 } 43 44 int water=b[0]; 45 int k=1; 46 for(int i=1;i<a;i++) 47 { 48 if(water!=b[i]) 49 { 50 k=k-1; 51 if(k<=0) 52 { 53 water=b[i+1]; 54 k=1; 55 i++; 56 } 57 } 58 else 59 { 60 water=b[i]; 61 k=k+1; 62 } 63 } 64 65 System.out.println("水王为"+water); 66 67 68 } 69 70 71 72 }