「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」
题目:
202. 快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和
。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
示例 1:
输入: 19
输出: true
解释: 12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例 2:
输入: n = 2
输出: false
提示:
1 <= n <= 231 - 1
思路:
- 写一个方法,去计算每一轮的数值平方和的结果(想思路的时候先不用想具体代码的实现,先做好规划)
- 边界判定,当返回值为1时循环结束
- 避免无线循环,找出结束的条件 -- 如果这个数字之前出现过,那么就证明已经陷入了无限循环
实现:
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
// 用来记录这个数字有没有出现过, 如果出现过就可以结束了
let set = new Set();
let cur = n;
while (!set.has(cur)) {
set.add(cur);
cur = findNext(cur);
// 结束条件判断
if (cur === 1) {
return true;
}
}
return false;
};
// 计算当前数字的快乐数, 游戏规则 每一位数字的平方累加
var findNext = function(number) {
str = number + ""; // js隐式转换,number转string
const n = str.length;
let result = 0;
for (let i = 0; i < n; i++) {
let cur = str[i] - 0; // js隐式转换,string转number
result += Math.pow(cur, 2);
}
return result;
}
总结:
这道题目是比较简单的。其中用到的知识点有es6新语法Set和JS的隐式转换,其中es6的Set和Map有点类似于后端语言中的hash哈希表结构,一般设计到hash的题目前端基本用Map代替。
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。