找出整數數組中出現次數超過數組長度一半的元素(Java)

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 + "]";
    }
}

總結:多看書和博客,從別人的代碼分享中理解思路,越思越明~~數組

相關文章
相關標籤/搜索