題目:數(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é)果