题目思路
在遍历数组时保存两个值,一个是数组中的数字,一个是次数。当遍历到下一个数字时,如果和我们当前保存的数字相同的话,次数加一,否则减一,如果次数为0的话,我们保存下一个数字,并将次数设为1;
最后
我们要找的数字一定是最后一次把此时设为1的相应的数字
易遗漏地方
要检验数组是否有效:即是否数组中含有符合题意的数字
代码:时间复杂度o(n)
/**
* 问题:数组中有一个数字出现次数超过数组长度的一半,找出这个数字
* 输入:{1,2,3,2,2,2,5,4,2}
* 输出:2
* 特殊输入:{3,2,3,3,2,2,2,4,3},检验输入的数组是否有效
* Created by lxq on 2017/9/2.
*/
public class Problem {
public static void main(String[] args){
Problem test = new Problem();
int[] numbers = {1,2,3,2,2,2,5,4,2};
Integer result = test.moreThanHalfNumber(numbers);
System.out.println( result );
}
public Integer moreThanHalfNumber(int[] numbers){
if(numbers==null)
return 0;
int count = 0;
Integer result = null;
for(int i=0;i<numbers.length;i++){
if(count==0){
result = numbers[i]; //最后一次把次数设为1的数字
count=1;
}else if(numbers[i]==result){
count++;
}else{
count--;
}
}
if(checkMoreThanHalf(numbers,result))
return result;
else
return null;
}
private boolean checkMoreThanHalf(int[] numbers, Integer result) {
int times = 0;
for(int i=0;i<numbers.length;i++){
if(numbers[i]==result)
times++;
}
if(times*2 <= numbers.length)
return false;
else
return true;
}
}