js-众数

104 阅读1分钟

今天面试有一个很简单的面试题,当时状态不好,什么也没有答上,事后花了几分钟解完了直接贴要求和代码

题目

给定一个大小为 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)