set
辗转的计算每一位,然后记录每一次的和,这样就可以避免循环的出现
var isHappy = function (n) {
let shown = new Set();
while (n !== 1 && !shown.has(n)) {
shown.add(n);
let sum = 0;
while (n > 0) {
let last = n % 10;
sum += last ** 2;
n = Math.floor(n / 10);
}
n = sum;
}
return n === 1;
};
Floyd 判圈算法
快慢指针检测环
-
slow每次走一步。 -
fast每次走两步。 -
如果相遇了:
- 若相遇点是
1→ 快乐数。 - 否则 → 死循环,不是快乐数。
- 若相遇点是
var isHappy = function (n) {
var getNextNumber = function (n) {
let sum = 0
while (n > 0) {
let last = n % 10
sum += last * last
n = Math.floor(n / 10)
}
return sum
}
let slow = n, fast = n
do {
slow = getNextNumber(slow)
fast = getNextNumber(getNextNumber(fast))
} while (slow !== fast)
return slow === 1
};