一、题目
随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的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 }
四、截图
五、实验总结
这次找水王的扩展,和原来找水王的思路是一样的,都是采用互消的方法,只不过由两两互消变为了四个四个的消。我们以后解决这种扩展问题时,一定要站在原来问题的基础上思考,这样思路就会更加清晰,解决问题的效率会更高。
时间: 2024-10-10 18:31:32