java 关于数组 计数的面试题
题目:用面向对象的方法求出数组中重复 value 的个数 : 1 出现:1 次3 出现:2 次8 出现:3 次2 出现:4
提供数组 : int[] arr = {1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5} ;
答案:
1 // 面试题,给定一个数组,按照顺序将 元素的重复次数打印出来 2 int array [] = {1,4,1,4,2,5,4,5,8,7,8,77,88,5,4,9,6,2,4,1,5} ; 3 Arrays.sort(array); // 排序 4 int count = 0 ; // 初始化计数器 5 int temp = array[0] ; // 初始化一个变量 此时为1(数组第一个元素) 6 //定义一个map,key为元素,value为次数。利用map 同样的key 会覆盖掉前面的value的特性 7 Map<Integer,Integer> map = new HashMap<Integer, Integer>() ; 8 for (int i=0 ; i<array.length ; ++i){ 9 //排完序,相同的元素会在一块,遇到不相同的 进行新的计数 10 if (temp != array[i]){ 11 temp = array[i] ; 12 count = 1 ; 13 }else { //然后遇到重复的 计数器+1, 14 count ++ ; 15 } 16 map.put(array[i],count) ; 17 } 18 // 将 map遍历出来 19 for (Map.Entry<Integer,Integer> entry : map.entrySet()){ 20 System.out.println(entry.getKey()+"出现了:"+entry.getValue()); 21 }
结果:
1出现了:3 2出现了:2 4出现了:5 5出现了:4 6出现了:1 7出现了:1 8出现了:2 88出现了:1 9出现了:1 77出现了:1
解题思路:先进行排序,这样重复的元素会排到一块。然后 将索引为0的元素赋值给 temp,然后循环遍历,如果temp == 遍历出来的值,计数器+1,如果 != 的话,就是新的不与上面的重复的元素,开始新的计数,然后将本次循环的元素 作为key,计数作为值,存到map中(map有个特性,同样的key会覆盖掉原来的value,这样就会一直覆盖到最新的重复数,再进行下一个新key的计数)。 最后将map 遍历打印出来,结束。