题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
这道题有多种解法,下面主要说两种。
- 常规方法:创建一个Map,遍历数组中的元素,如果元素不在map中出现过,将元素设置为key,value=1,如果元素在map中,就取出这个元素,并将对应的value值+1.最后遍历map中的元素,如果有value>数组长度的一半,就返回值
- 思维方法:先对数组进行排序,如果有一个元素出现的次数超过了数组长度的一半,那么这个元素肯定是排序过后数组的中间值。取出中间值和原来的数组对比,如果相同count+1,最后判断count大小是否大于一半。
function Solution(arr) {
var m = new Map()
arr.forEach(x => {
if(m.get(x)){
let num = m.get(x)+1
m.set(x,num)
}else{
m.set(x,1)
}
});
let mid = Math.floor(arr.length/2)
for(let [key,value] of m){
if(value>mid){
return key
}
}
return 0
}
function Solution(arr) {
let sortArr = arr.sort()
let count = 0;
let midNum = sortArr[Math.floor(sortArr.length/2)]
for(let i = 0;i<arr.length;i++){
if(arr[i]===midNum){
count++
}
}
return count > Math.floor(sortArr.length/2) ? midNum : 0
}