LeetCode笔记:快乐数
问题
编写一个算法来判断一个数 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,为 true
- 死循环,得不到结果 1,这时候用快慢指针判断是否有两个指针相遇的情况,来判定是否陷入死循环
代码:
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function (n) {
let after = n; // 当前值
let forward = nextNum(n); // 向前走一步
// 以下两种情况退出循环
// forward == after: 快慢指针相遇
// forward == 1: 取到了结果1
while (forward != after && forward != 1) {
after = nextNum(after); // 慢指针向前走一步
forward = nextNum(nextNum(forward)); // 快指针向前走两步
}
// 返回结果
return forward == 1;
// 取得下一个数字,即当前每个位置数字的平方和
function nextNum(n) {
return (n + "")
.split("")
.map((a) => a ** 2)
.reduce((x, y) => x + y);
}
};
评论