【Leetcode】202. 快乐数

48 阅读1分钟

leetcode-202.png

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
};