347. 前 K 个高频元素
给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
示例 2:
输入: nums = [1], k = 1
输出: [1]
思路,首先,通过遍历统计每个数字出现的次数,然后进行倒序截取出现频率前K的元素
对于Map 和Set 不了解的小伙伴们,可以去mdn上面看一下,然后就能看的很明白了,
let nums = [1, 1, 1, 2, 2, 3]
let k = 2
var topKFrequent = function (nums, k) {
let map = new Map()
let arr = [...new Set(nums)] //[1,2,3]
nums.forEach(item => {
map.set(item, map.get(item) ? map.get(item) + 1 : 1)
});
// 这时候的map {1:3,2:2,3:1}
return arr.sort((a, b) => map.get(b) - map.get(a)).slice(0, k);
};
console.log(topKFrequent(nums, k));
202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 true ;不是,则返回 false 。
示例 1:
输入:n = 19
输出:true
解释:
1*1 + 9*9 = 82
8*8 + 2*2 = 68
6*6 + 8*8 = 100
1*1 + 0*0 + 0*0 = 1
示例 2:
输入: n = 2
输出: false
思路: 这里是通过快慢指针的方式来实现的
创建一个慢指针,一次走一步,再创建一个快指针,一次走两步。
当快慢指针相遇,代表形参环路,该数不是快乐数。
若指针移动过程中,找到了 11,则当前数是一个快乐数。
let getNext = function (n) {
// 这一步操作 传入的数字 --> 字符串 --> 数组 --> 遍历 平方 --> 相加
return n.toString().split('').map(i => i * i).reduce((a, b) => a + b);
}
let isHappy = function (n) {
let slow = n;
let fast = getNext(n);
while (fast !== 1 && fast !== slow) {
slow = getNext(slow);
fast = getNext(getNext(fast));
console.log(slow, fast);
}
return fast === 1;
};
console.log(isHappy(n));