题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
题解一:HashMap
1 public static int MoreThanHalfNum_Solution(int [] array) { 2 if (array.length == 0) { 3 return 0; 4 } 5 //分别存放重复的元素以及出现的次数 6 HashMap<Integer, Integer> map = new HashMap<>(); 7 int len = array.length; 8 for (int i = 0; i < len; i++) { 9 if (map.containsKey(array[i])) { 10 Integer integer = map.get(array[i]); 11 //++integer 此处必须这样写,因为需要先增再放 12 map.put(array[i], ++integer); 13 } else { 14 map.put(array[i], 1); 15 } 16 } 17 Iterator iter = map.entrySet().iterator(); 18 while (iter.hasNext()) { 19 Map.Entry entry = (Map.Entry) iter.next(); 20 Integer key = (Integer) entry.getKey(); 21 Integer val = (Integer) entry.getValue(); 22 if (val > array.length / 2) { 23 return key; 24 } 25 } 26 return 0; 27 }
题解二:sort(快排)
1 public static int MoreThanHalfNum_Solution01(int [] array) { 2 Arrays.sort(array); 3 int count=0; 4 //数组排序后,如果符合条件的数存在,则一定是数组中间那个数 5 for(int i=0;i<array.length;i++){ 6 if(array[i]==array[array.length/2]){ 7 count++; 8 } 9 } 10 if(count>array.length/2){ 11 return array[array.length/2]; 12 }else{ 13 return 0; 14 } 15 }
测试:
1 public static void main(String[] args) { 2 int[] array={1,2,3,2,2,2,5,4,2}; 3 int value = MoreThanHalfNum_Solution(array); 4 System.out.println(value); 5 } 6 输出:2
原文地址:https://www.cnblogs.com/Blog-cpc/p/12428015.html
时间: 2024-10-10 06:32:01