今天面试有一个很简单的面试题,当时状态不好,什么也没有答上,事后花了几分钟解完了直接贴要求和代码
题目
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在众数。
解题思路
在遍历数组过程中,利用对象属性不重复的特性,对象的属性是数组里的值,对象的属性值是默认是1,如果遇到重复的就+1
let arr = [1,2,3,4,5,6,6,7,2,4,2,2,2,2,2,2,2]
function must (arr) {
let obj = {}
let len = arr.length
let res
for (let i = 0; i < len; i++) {
arr[i] in obj ? obj[arr[i]]++ : obj[arr[i]] = 1
}
console.log(obj)
for(let key in obj) {
if (obj[key] >= len /2) {
res = +key
}
}
// console.log(res, 'res')
return res
}
must(arr)
下边是优化的下,降低了点时间复杂度 <= o(n),在这个题目中抓住特点就是 众数出现此时是 > n/2, 所以这里只有一个众数,所以如果在循环中某个数出现次数大于n/2,直接跳出循环。
let arr = [1,2,3,4,5,6,6,7,2,4,2,2,2,2,2,2,2]
function must (arr) {
let obj = {}
let len = arr.length
let res
for (let i = 0; i < len; i++) {
if ( arr[i] in obj) {
obj[arr[i]]++
if(obj[arr[i]] > len/ 2 ) {
res = arr[i]
break
}
} else {
obj[arr[i]] = 1
}
}
// console.log(obj)
return res
// console.log(res, 'res')
}
must(arr)