题目:三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。 如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码) 随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
思路:这次如果还是按照我上一个找水王的思路来的话,根本想不出来,后来根据老师让同学讲的上一个题的另外的思路,我想了想,可以设三个返回值,并且需要用到数组,num的3个元素分别对应当前遍历过的3个ID出现的个数。如果遍历中有某个ID不同于这3个当前ID,我们就判断当前3个ID是否有某个的num为0,如果有,那这个新遍历的ID就取而代之,并赋1 为它的遍历数(即num减1),如果当前3个ID的num皆不为0,则3个ID的num皆减去1,这也就是解决本文题的关键了。由于非水王ID不满总帖数的1/4,所以所遍历ID与当前3个ID不同时,就一同抵消,最终留下来的3个当 前ID总会是3个超过1/4的水王ID。
代码:
1 package zxf; 2 import java.util.Scanner; 3 public class main { 4 public static void main(String[] args){ 5 Scanner in=new Scanner(System.in); 6 int N; 7 System.out.println("请输入帖子的总数:"); 8 N=in.nextInt(); 9 String list[]=new String[N]; 10 int i; 11 System.out.println("请输入ID:"); 12 for(i=0;i<N;i++) 13 { 14 list[i]=in.next(); 15 } 16 int num[]=new int[3];//利用J为每个水王的便利进行标记 17 num[0]=num[1]=num[2]=0; 18 String ID[]=new String[3];//设定单个水王ID 19 for(i=0;i<N-1;i++) 20 { 21 if(num[0]==0)//当计数器为0时,重新赋予水王ID 22 { 23 num[0]++; 24 ID[0]=list[i]; 25 } 26 else if(num[1]==0) 27 { 28 num[1]++; 29 ID[1]=list[i]; 30 } 31 else if(num[2]==0) 32 { 33 num[2]++; 34 ID[2]=list[i]; 35 } 36 37 else if(list[i].equals(ID[0]))//相同ID时计数器增加 38 { 39 num[0]++; 40 } 41 else if(list[i].equals(ID[1])) 42 { 43 num[1]++; 44 } 45 else if(list[i].equals(ID[2])) 46 { 47 num[2]++; 48 } 49 50 else//不同ID时因两两相消计数器减小 51 { 52 num[0]--; 53 num[1]--; 54 num[2]--; 55 } 56 } 57 System.out.println("三个水王分别是是:"+ID[0]+" "+ID[1]+" "+ID[2]); 58 in.close(); 59 } 60 }
个人总结:因为上次自己的程序不是这个思路,所以写起来还是有一定难度的。但是一旦把思路想好了,程序写起来就不是很困难了。