找出数组中出现次数超过数组长度一半的数字
剑指offerJZ28:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
这道题是在面试时常问的一道题
方法一:利用map
利用map的key -value模型来存放arr[i]和相对应出现的次数,最后用次数去跟数组长度一半去比较,大于则就是;比如1,2,3,2,2,2,5,4,2;就是1出现一次、2出现5次、3.4.5各出现一次;返回的就是2。
public static int solution1(int[] arr){
//利用map的key value模型来存放arr[i]和相对应出现的次数
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<arr.length;i++){
if(map.containsKey(arr[i])){
map.put(arr[i],map.get(arr[i])+1);//已经存在就给value加1
}
else{
map.put(arr[i],1);
}
}
for(Map.Entry<Integer,Integer> entry:map.entrySet()){
if(entry.getValue()>arr.length/2){
return entry.getKey();
}
}
return 0;
}
方法二:排序求中间值
出现的次数超过长度一半,那给数组排序以后,它一定处在最中间的位置;比如1,2,3,2,2,2,5,4,2排完序是1,2,2,2,2,2,3,4,5,;接下来去统计数组中跟arr[mid]值一样的元素,相等count++;如果count的值大于mid,则说明存在输出,否则返回0。
public static int solution2(int[] arr){
//先对数组排序,如果这个数存在,那它一定在arr[mid]的位置,
Arrays.sort(arr);
int count=0;
int mid=arr.length/2;
for(int i=0;i<arr.length;i++){
if(arr[i]==arr[mid]){
count++;
}
}
if(count>mid){//出现的次数超过mid,则返回它;
return arr[mid];
}
return 0;
}