题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
输入 | [1,2,3,2,2,2,5,4,2] |
---|---|
返回值 | 2 |
以下是本篇文章正文内容,下面案例可供参考
解题思路
采用HashMap:
- 将数组中的每一个array[i] 放进map中,key-value分别代表数字(
int key = array[i]
)和它出现的次数(map.get(key)
); - 如果map中已经存在key,则给value值+1;
- 最后判断value值是否大于数组长度的一半,满足条件,则输出对应的key值。
代码如下
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
HashMap<Integer,Integer> map = new HashMap<>();
int len = array.length;
if(len == 0) return 0;
if(len == 1) return array[0];
for(int i =0;i<len;i++){
int key = array[i];
//map中已经有array[i]这个值
if(map.containsKey(key)){
if(map.get(key)+1>len/2){//map.get(key)得到的是value值
//+1:判断加上本次的次数是否大于len/2,防止最后一个数是想要输出的数而无法计入+1
return key;
}else{
map.replace(key,map.get(key)+1);//如果map中存在,将对应的value值+1
//replace()方法:替换 hashMap中指定的key对应的value
}
}else{
//map中没有array[i]这个值
map.put(key,1);//给value初始值为1
}
}
//代码走到这,表示没有以上情况发生,返回0
return 0;
}
}
不建议使用:
import java.util.*;
public class Solution {
public int MoreThanHalfNum_Solution(int [] array) {
Arrays.sort(array);
if(array.length == 1) {
return array[0];
}
int len = array.length;
for(int i = 0;i <= len/2;i++) {
for(int j = i+len/2;j < len;j++) {
if(array[i] == array[j]) {
return array[i];
}
}
}
return 0;
}
}
总结
replace()
方法:
替换 hashMap中指定的key对应的value
hashmap.replace(K key, V oldValue, V newValue)
oldValue,表示key对应的旧value,newValue表示想要更换成的新的value
本文写法为:map.replace(key,map.get(key)+1);
hashmap.replace(key,newValue);