课堂练习(寻找水王)
第一步:实现水王查找
设计思路:
利用哈希表的方法,将数组中的所有信息都存入到哈希表中,因为水王的发帖量是所有人中最多的,所以通过哈希表的一个遍历找出ID号出现次数最多的那个值就是水王了
1 package t2; 2 /* 3 * 4 * 用哈希表的方法寻找水王 5 */ 6 import java.util.HashMap; 7 import java.util.Iterator; 8 import java.util.Scanner; 9 10 public class A { 11 static Scanner in = new Scanner(System.in); 12 13 public static void main(String[] args) { 14 // TODO 自动生成的方法存根 15 String[] num = {"001","002","001","003","001","004","001","006","001","001"}; 16 String a = new String(); 17 18 HashMap<String ,Integer> has = new HashMap<String ,Integer> (); // 打开一个哈希表 19 for (int i = 0; i < num.length; i++) 20 { 21 if (!has.containsKey(num[i])) 22 { 23 has.put(num[i], 1); 24 } 25 else 26 { 27 has.put(num[i],has.get(num[i])+1 ); 28 } 29 } 30 Iterator<String> iterator = has.keySet().iterator(); 31 int max=0; 32 while(iterator.hasNext()) 33 { 34 String word = (String) iterator.next(); 35 if(max < has.get(word)) 36 { 37 max=has.get(word); 38 a=word; 39 } 40 } 41 System.out.println("水王是:" + a); 42 } 43 }
第二步:对程序进行改进,实现在一次遍历之后就可以找到水王的位置
设计思路:在循环中对每个数组元素遍历,首先对第一个赋值为b,如果接下来的值与b进行比较,设置计数器,如果与b相同则计数器加1如果不同计数器减1,然后就与接下来的元素进行比较(这就相当于如果不同就将两个元素删除,根据提议最后在减去所有不同的过后,就只剩下水王了,要知道水王ID出现的次数超过了一半)如果计数器减为负数,则将下一个值赋值给b重复以上步骤,最后b的值就是水王的ID号了。
1 package t2; 2 3 public class B { 4 5 6 /** 7 * @param args 8 */ 9 public static void main(String[] args) { 10 // TODO Auto-generated method stub 11 //用户id集合 12 String a[]=new String[]{"001","002","001","003","001","004","001","006","001","001"}; 13 String b=a[0]; 14 int n=0; 15 for(int i=0;i<a.length;i++) 16 { 17 if(a[i]==b) 18 { 19 n=n+1; 20 } 21 else 22 { 23 n=n-1; 24 if(n<0) 25 { 26 b=a[i]; 27 n=1; 28 } 29 } 30 } 31 System.out.print("水王是:"+ b); 32 } 33 34 35 }
个人总结:这就是今天课上所讲的一个内容,通过适当的方法进行合理的规划,虽然当你知道思路之后感觉这个算法会很简单,但是当你初次接触这个问题时,让你独立的处理这个问题时往往都是通过消耗大量空间时间的办法进行处理,进行优化的过程还是很艰难的,这也就转化到了现实的项目问题中,如何使用简单的方法使得我们能更简单便捷的解决实际的操作问题