力扣刷题-前k个高频元素
题目:
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/top-k-frequent-elements
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这里对这个javascript的二维数组,又给搞蒙了,好像js没有二维数组,所以如果这样arr[1][1]
是取不到的,会报错,但是sort,forEach,map里面怎么又可以用了呢,太奇怪了,作为一个极其喜欢用for循环写题的人极其不理解这种操作。所以是为啥有没有大佬能指点一下。
今天也是第一次看到原来数组也有map方法,说实话跟ForEach方法很像,只不过forEach永远返回undefined,然后map返回的东西自己在函数里面写。
还有就是Map字典为什么不可以map.get(nums[i])直接对它加一,为什么又要set()一次,可以这样覆盖掉键值吗,虽然好像必须这样,有点小奇怪
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
var topKFrequent = function(nums, k) {
var map = new Map()
for(var i = 0; i < nums.length; i++){
if(map.has(nums[i])){
map.set(nums[i],map.get(nums[i])+1)
}else{
map.set(nums[i],1)
}
}
var list = Array.from(map).sort(function(a,b){ return b[1]-a[1] })//这里注意是return 1,则后面的数放在前面
console.log(list)
var list = list.slice(0,k)
console.log(list)
var arr= []
list.forEach(function(item){ arr.push(item[0])},this)
// return list.map(function(item){
// return item[0]
// })
return arr
};