1.问题明细
三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?
2.设计思想
①从名单的第一位开始查找,假设第一位是水王,设定水王存在次数为1;
②按照名单,从“假设的水王”开始的下一个名字进行对比,若相同,则存在次数+1,若不存在,则存在次数-1;
③查看水王存在次数,若非0,则继续执行②,若为0,则当前不是水王,选定下一位为“假设的水王”,执行第①步;
④当查找结束后,最终保留下来的假设的水王就是真正的水王。
3.源代码
1 public class WaterKing 2 { 3 public static void main(String args[]) 4 { 5 int N = 10; 6 7 String ID[] = new String [N]; 8 ID[0]="Ben"; 9 ID[1]="Jerry"; 10 ID[2]="Ben"; 11 ID[3]="Dan"; 12 ID[4]="Ben"; 13 ID[5]="Ben"; 14 ID[6]="Dan"; 15 ID[7]="Ben"; 16 ID[8]="Ben"; 17 ID[9]="Tom"; 18 19 int number = 1 ,time = 0; 20 String name = ID[time]; 21 22 for(int i = 1;i < N;i++) 23 { 24 if(name == ID[i]) 25 { 26 number++; 27 } 28 else 29 { 30 number--; 31 if(number == 0) 32 { 33 time++; 34 name = ID[time]; 35 i = time; 36 number = 1; 37 } 38 } 39 } 40 41 System.out.println("论坛中的水王是:"+name+"。"); 42 } 43 }
4.结果截图
5.实验心得
解决问题时,要抓住问题的重点。比如当前问题中的关键就是:该水王的发帖数目超过了总帖数的一半,由此可以判断,名单里一半以上都是水王的名字,所以,我们就需要从第一位开始找,遇到相同名字就+1,遇到不同名字就-1,除了水王,其他人一定都会变为0,如果是水王的话,这样执行到最后结果一定会为正值,由此可以判断是水王。如若没有注意到这一关键,解决问题也就无从谈起。