Question:數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字java
package com.study.zhipengs.test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; /** * 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。 * 例如輸入一個長度爲9的數組{1, 2, 3, 2, 2, 2, 5, 4, * 2}。因爲數字2在數組中出現了5次,超過數組長度的一半,所以輸出2. * * 全部數字的個數均沒有超過數組長度的一半,則返回-1 * * @author zhipegs * */ public class Test { public static void main(String[] args) { int[] numbers = { 1, 2, 2, 5, 6, 2, 5, 2, 2}; System.out.println("number: " + mapSolve(numbers)); System.out.println("number: " + sortSolve(numbers)); } /** * 先排序---排序後統計每一個數字出現的次數,出現次數超過數組長度一半的那個必定出如今中間 * @param numbers * @return int */ private static int sortSolve(int[] numbers) { Arrays.sort(numbers); int count = 0; int len = numbers.length; int pos = (int) Math.rint((double)len/2.0); int midValue = numbers[pos]; for(int i=0;i<len;i++) { if(numbers[i] == midValue) { count ++; if(count > pos) { return midValue; } } } return -1; } /** * 不排序--相同數字存儲到Map的key中,個數在value中遞增計算 * @param numbers * @return int */ private static int mapSolve(int[] numbers) { int len = numbers.length; int pos = (int) Math.rint((double)len/2.0); Map<String,MyInteger> map = new HashMap<String,MyInteger>(); MyInteger mi; for(int i=0;i<numbers.length;i++) { String key = numbers[i]+""; mi = map.get(key); if(mi != null) { int value = mi.get()+1; mi.set(value); map.put(key, mi); if(value > pos) { return numbers[i]; } continue; } mi = new MyInteger(); mi.set(1); map.put(key, mi); } return -1; } } /** * 自定義MyInteger */ class MyInteger { private int value; public void set(int value) { this.value = value; } public int get() { return this.value; } @Override public String toString() { return "MyInteger [value=" + value + "]"; } }
總結:多看書和博客,從別人的代碼分享中理解思路,越思越明~~數組