题目:
数组中有一个数字的出现次数超过了数组的一半,请找出这个数字,例如输入一个长度为8的数组{1,3,7,7,7,7,7,5},由于7出现了5次,所以输出7.
输入:
{1,3,7,7,7,7,7,5}
输出:
7
解题思路:
1、该数字出现次数最多,循环每个数字,并用一个变量A保存数字出现次数另一个变量B保存出现最多次数的数字。
2、当下一个数字和当前一个数字一样,次数+1,否则次数-1.如果次数为0,则变量A设置为1,变量B设置为当前数字。
3、由于要找的数字出现次数最多,所以他是最后一次遍变量A变为1的,也是变量A最长的数字。
Java代码实现:
private static int MoreThanHalf2(int[]arr,int length){
if(arr==null || length<=0){
return -1;
}
int key=arr[0];//数组中出现次数最多的数字
int times=1;//次数
for(int i=1;i<length;i++){
//如果为0,则表示换数
if(times==0){
key=arr[i];
times=1;
//相等次数+1
}else if(arr[i]==key){
times++;
//不想当次数-1
}else {
times--;
}
}
//错误检测
if(!IsMoreThanHalf(arr, length, key)){
return -1;
}
return key;
}
//该函数用于检测key是否超过数组的一半
private static boolean IsMoreThanHalf(int []arr,int len,int key)
{
int times = 0;
int i;
for(i=0;i<len;i++)
if(arr[i] == key)
times++;
if(2*times <= len)
return false;
else
return true;
}