题目描述:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
解题思路:
思路有多个,比如先排序,找到中位数,则有可能是所要找的数字。或者利用快排的思想,找到下标[n/2]的数字即中位数。中位数有可能是要找的数字,但只是有可能是,因为出现次数超过一半的数字未必存在,所以还需要进一步的判断。
下面的这种思路更为巧妙一些:
如果这个出现次数超半数的数字存在,那么 用一个其他的数抵消掉一个这个数,那么这个剩下的数可能就是要求的数。
public class FindMoreThanHalfNumTest {
public static int find(int[] num) {
if (num == null) {
return 0;
}
int result = num[0];
int times = 1;
for (int i = 1; i < num.length; i++) {
if (times == 0) {
times = 1;
result = num[i];
} else if (result == num[i]) {
times++;
} else {
times--;
}
}
if (!checkMoreThanHalf(num, result)) {
result = 0;
}
return result;
}
private static boolean checkMoreThanHalf(int[] num, int result) {
int times = 0;
for(int i = 0 ; i < num.length; i++){
if(num[i] == result){
times ++;
}
}
if(times >= num.length / 2){
return true;
}
return false;
}
public static void main(String[] args) {
int[] numbers = new int[]{1, 2, 3, 2, 2, 2, 5, 4, 2};
System.out.println(find(numbers));
}
}