剑指offer系列54---数组中出现次数超过一半的数

时间:2023-03-10 07:12:50
剑指offer系列54---数组中出现次数超过一半的数

【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
* 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
* 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
* 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;

 package com.exe11.offer;

 /**
* 【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
* 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
* 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
* 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;
* @author WGS
*
*/
public class MoreThanHalfNumber { boolean isValid=true;//全局变量用来表示次数没有一半情况 public int getMoreThanHalfNumber(int[] nums){ if(nums==null || nums.length<=0) return 0;
int index=0;
int times=0;
int target=nums[index]; while(index<nums.length){
if(times==0){
target=nums[index];
times=1;
}else if(nums[index]==target){
times++;
}else{//nums[index]!=target
times--;
}
index++;
}
//如果出现次数最多的数字没有达到数组长度一半的话,就返回0;
int times2=0;
for(int i=0;i<nums.length;i++){
if(nums[i]==target){
times2++;
}
}
if(2*times2<=nums.length){
isValid=false;
return 0;
} System.out.println(isValid);
return target; } public static void main(String[] args) {
MoreThanHalfNumber m=new MoreThanHalfNumber();
int[] nums=new int[]{1,2,3,2,5,4,2};
int n=m.getMoreThanHalfNumber(nums);
System.out.println(n);
}
}