题目要求:
•三人行设计了一个灌水论坛。信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子数目的一半。
•如果你有一张当前论坛的帖子(包括回帖)列表,其中帖子的作者的ID也在其中,你能快速的找到这个传说中的水王吗?(参考核心代码)
•随着论坛的发展,管理员发现水王没有了,但是统计结果表明,有三个发帖很多的ID。据统计他们的发帖数量超过了1/4,你能从发帖列表中快速找到他们吗?
实现思路:
1.还是将问题抽象化,目前有一组数据,其中有大于等于4分之1的数据是一个确定的值,而且这样的确定的值有三个,剩下的不到四分之一的值都不重复。
2.这样就好办了,还是按照第一次找水王的思路来就可以啦,不过这次的返回值是三个,需要用到数组来解决,nTimes 的3个元素分别对应当前遍历过的3个ID出现的 个数。如果遍历中有某个ID不同于这3个当前ID,我们就判断当前3个ID是否有某个的nTimes为0,如果有,那这个新遍历的ID就取而代之,并赋1 为它的遍历数(即nTimes减1),如果当前3个ID的nTimes皆不为0,则3个ID的nTimes皆减去1,这也就是解决本文题的关键了。由于非 水王ID不满总帖数的1/4,与上题思路相同,所遍历ID与当前3个ID不同时,就一同抵消(即3个当前ID的nTimes值减1),最终留下来的3个当 前ID总会是3个超过1/4的水王ID。
代码实现:
1 public class Find { 2 static int[] ID=new int[100]; 3 int Rand()//生成0-1内的随机数 4 { 5 java.util.Random random=new java.util.Random();// 定义随机类 6 int result=random.nextInt(4);// 返回[0,4)集合中的整数,注意不包括4 7 return result; 8 } 9 void FirstC()//初始化数组; 10 { 11 for(int i=0;i<100;i++) 12 { 13 if(Rand()==0) 14 { 15 ID[i]=50;//水王一号的ID 16 } 17 else if(Rand()==1) 18 { 19 ID[i]=60;//水王二号的ID 20 } 21 else if(Rand()==2) 22 { 23 ID[i]=70;//水王三号的ID 24 } 25 else 26 { 27 ID[i]=i; 28 } 29 30 } 31 32 } 33 void Out() 34 { 35 System.out.println("以下是水贴的ID单"); 36 for(int i=1;i<=ID.length;i++) 37 { 38 System.out.print(ID[i-1]+" "); 39 if(i%10==0) 40 { 41 System.out.print("\n"); 42 } 43 } 44 } 45 /* int Serch()//思想实现部分 46 { 47 int candIDate=50; 48 int ntimes,i; 49 for(i = ntimes = 0;i<ID.length;i++){ 50 if(ntimes == 0){ 51 candIDate = ID[i]; 52 ntimes = 1; 53 } 54 else{ 55 if(candIDate == ID[i]) 56 ntimes ++; 57 else 58 ntimes --; 59 } 60 } 61 return candIDate; 62 }*/ 63 public static int[] Serchs(int[] ID) 64 { 65 66 if(ID == null) return null; 67 int candate0= 0; 68 int candate1= 0; 69 int candate2= 0; 70 int times0 = 0; 71 int times1 = 0; 72 int times2 = 0; 73 int len = ID.length; 74 for(int i =0;i<len;i++){ 75 if(times0==0&&ID[i]!=candate1&&ID[i]!=candate2){ 76 candate0=ID[i]; 77 times0++; 78 } 79 else if(times1==0&&ID[i]!=candate0&&ID[i]!=candate2){ 80 candate1=ID[i]; 81 times1++; 82 } 83 else if(times2==0&&ID[i]!=candate0&&ID[i]!=candate1){ 84 candate2=ID[i]; 85 times2++; 86 } 87 else if(ID[i]!=candate1&&ID[i]!=candate0&&ID[i]!=candate2){ 88 times0--; 89 times1--; 90 times2--; 91 } 92 else if(ID[i]==candate0) 93 times0++; 94 else if(ID[i]==candate1) 95 times1++; 96 else if(ID[i]==candate2) 97 times2++; 98 } 99 int[] result = {candate0,candate1,candate2}; 100 return result; 101 } 102 103 @SuppressWarnings("static-access") 104 public static void main(String[] args) { 105 Find a = new Find(); 106 a.FirstC(); 107 a.Out(); 108 int[] results=new int[3]; 109 results=a.Serchs(ID); 110 System.out.println("三个水王的ID分别是"); 111 for(int i=0;i<3;i++) 112 { 113 System.out.println("第"+(i+1)+"个水王的ID是"+results[i]); 114 } 115 116 } 117 118 }
运行结果截图:
修改水王ID再次运行程序,观察结果:
运行结果:
心得体会:
1.思想非常重要,
2.当遇到再三思索后实在不懂的问题是第一反应应当是"百度一下"当然,先把问题看会在交作业,学到的就是自己的,学习能力也很重要嘛!
时间: 2024-10-14 00:31:41