软件工程——找水王(续)

一、题目

  随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗

二、设计思路

  参考原来问题的解法,如果每次删除4个不同的ID(不管是否超过总数1/4的ID),那么,剩下的ID列表中,原先发帖比例大于1/4的ID所占比例仍然大于1/4。可以通过不断重复这个过程,把ID总数降低,从而得到问题的答案。具体方法:用candidate[3]记录三个候选ID,用count[3]记录它们的累积次数,然后遍历整个ID列表,每处理一个ID,若与candidate[i]中的某一个相同,则count[i]++,若与三个都不同,则说明找到了四个互不相同的ID,将三个count[i]--,也就相当于“删除了四个不同ID”,若某一个count[i]==0,则更新之。

三、源代码

 1 package com.java.lianxi;
 2 
 3 public class lianxi8 {
 4     public static void main(String arg[]){
 5         int ID[]={1,2,1,1,2,3,2,3,3,4,4};
 6         Find(ID);
 7     }
 8     public static void Find(int ID[])  
 9     {  
10         int i,N=ID.length;
11         int nTimes[]=new int[3]; 
12         int candidate[]=new int[3]; 
13         nTimes[0]=nTimes[1]=nTimes[2]=0;  
14         candidate[0]=candidate[1]=candidate[2]=0;  
15         for(i = 0; i < N; i++)  
16         {  
17             if(ID[i]==candidate[0])  
18             {  
19                  nTimes[0]++;  
20             }  
21             else if(ID[i]==candidate[1])  
22             {  
23                  nTimes[1]++;  
24             }  
25             else if(ID[i]==candidate[2])  
26             {  
27                  nTimes[2]++;  
28             }  
29             else if(nTimes[0]==0)  
30             {  
31                  nTimes[0]=1;  
32                  candidate[0]=ID[i];  
33             }  
34             else if(nTimes[1]==0)  
35             {  
36                  nTimes[1]=1;  
37                  candidate[1]=ID[i];  
38             }  
39             else if(nTimes[2]==0)  
40             {  
41                  nTimes[2]=1;  
42                  candidate[2]=ID[i];  
43             }  
44             else  
45             {  
46                  nTimes[0]--;  
47                  nTimes[1]--;  
48                  nTimes[2]--;  
49              }  
50         } 
51         for(i=0;i<3;i++)
52         {
53             System.out.println("水王"+(i+1)+"的ID是"+candidate[i]);
54         }
55         } 
56 
57 }

四、截图

五、实验总结

  这次找水王的扩展,和原来找水王的思路是一样的,都是采用互消的方法,只不过由两两互消变为了四个四个的消。我们以后解决这种扩展问题时,一定要站在原来问题的基础上思考,这样思路就会更加清晰,解决问题的效率会更高。

posted on 2015-04-26 17:10  王雪青  阅读(564)  评论(0编辑  收藏  举报