【劍指Offer 29】數(shù)組中出現(xiàn)次數(shù)超過一半的數(shù)字

題目:數(shù)組中有一個數(shù)字出現(xiàn)的次數(shù)超過數(shù)組長度的一半,請找出這個數(shù)字。

代碼如下:

package demo;

public class Test29 {
    public static int moreThanHalfNum(int[] numbers) {
        if (numbers == null || numbers.length < 1) {
            throw new IllegalArgumentException("array length must be larger than 0");
        }
        // 記錄出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)
        int result = numbers[0];
        // 記錄次數(shù)
        int count = 1;
        // 從第2個數(shù)開始向后找
        for (int i = 1; i < numbers.length; i++) {
            // 如果計數(shù)為0
            if (count == 0) {
                // 重新記錄一個數(shù),假設(shè)它是出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)
                result = numbers[i];
                // 記錄次數(shù)
                count = 1;
            }
            // 如果記錄的數(shù)與后面的數(shù)相等,則次數(shù)增加
            else if (result == numbers[i]) {
                count++;
            }
            // 如果不相等,則次數(shù)減少
            else {
                count--;
            }
        }

        // 計算result出現(xiàn)的次數(shù)
        int count2 = 0;
        for (int number : numbers) {
            if (result == number) {
                count2++;
            }
        }
        // 如果出現(xiàn)次數(shù)超過數(shù)組長度的一半,就返回該數(shù)
        if (count2 > numbers.length / 2) {
            return result;
        }
        // 否則就輸入異常
        else {
            throw new IllegalArgumentException("invalid input");
        }
    }

    public static void main(String[] args) {
        System.out.println("存在出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)字:");
        int[] numbers1 = { 1, 2, 3, 2, 2, 2, 5, 4, 2 };
        System.out.println(moreThanHalfNum(numbers1));
        System.out.println("存在出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)字,且出現(xiàn)在數(shù)組前半部分:");
        int[] numbers2 = { 2, 2, 2, 2, 2, 1, 3, 4, 5 };
        System.out.println(moreThanHalfNum(numbers2));
        System.out.println("存在出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)字,且出現(xiàn)在數(shù)組后半部分:");
        int[] numbers3 = { 1, 3, 4, 5, 2, 2, 2, 2, 2 };
        System.out.println(moreThanHalfNum(numbers3));
        System.out.println("只有1個數(shù)字:");
        int[] numbers4 = { 1 };
        System.out.println(moreThanHalfNum(numbers4));
        System.out.println();
        System.out.println();
        System.out.println("輸入空指針:");
        System.out.println(moreThanHalfNum(null));
        System.out.println();
        System.out.println();
        System.out.println("不存在出現(xiàn)次數(shù)超過數(shù)組長度一半的數(shù)字:");
        int[] numbers5 = { 1, 2, 3, 2, 4, 2, 5, 2, 3 };
        System.out.println(moreThanHalfNum(numbers5));

    }
}
運(yùn)行結(jié)果

來源:http://blog.csdn.net/derrantcm/article/details/46736859

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容