找水王02

  题目:三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他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 }

  个人总结:因为上次自己的程序不是这个思路,所以写起来还是有一定难度的。但是一旦把思路想好了,程序写起来就不是很困难了。

原文地址:https://www.cnblogs.com/quite-love/p/5535731.html