这是剑指offer上很有意思也很简单的一道题目,想了三种写法,都通过了,在这总结一下:
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class halfNumJZ28 {
/*
* 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
* 方法1:对数组排序,中间那个数一定是
* 方法2:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多
* 方法3:用map记录数字及次数
* */
public int MoreThanHalfNum_Solution1(int [] array) {
if(array.length==0){
return 0;
}
Arrays.sort(array);
int middle=array[array.length/2];
int count=0;
for(int i=0;i<array.length;i++){
if(array[i]==middle){
count++;
}
}
if(count>array.length/2){
return middle;
}
return 0;
}
public int MoreThanHalfNum_Solution2(int [] array){
if(array.length==0){
return 0;
}
int res=array[0];
int count=1;
for(int i=1;i<array.length;i++){
if(array[i]==res){
count++;
}else{
count--;
}
if(count==0){
res=array[i];
count=1;
}
}
int cou=0;
for(int i=0;i<array.length;i++){
if(array[i]==res){
cou++;
}
}
if(cou>array.length/2){
return res;
}
return 0;
}
public int MoreThanHalfNum_Solution3(int [] array){
Map<Integer,Integer> numToTime=new HashMap<>();
for(int i=0;i<array.length;i++){
if(!numToTime.containsKey(array[i])){
numToTime.put(array[i],1);
}else{
int count=numToTime.get(array[i]);
numToTime.put(array[i],count+1);
}
}
for(int i=0;i<array.length;i++){
if(numToTime.get(array[i])>array.length/2){
return array[i];
}
}
return 0;
}
}
之后碰到觉得有意思的题目也会总结,继续冲冲冲!