202. 快乐数

哈希

解题思路

  1. 求和的过程中,sum 会重复出现,当遇到了要快速判断一个元素是否出现集合里的时候,就要考虑 哈希

  2. 如果 sum 在哈希中出现过,证明已陷入无限循环了;

复杂度

  1. 时间复杂度:O(logn)

  2. 空间复杂度:O(logn)

代码实现

var isHappy = function (n) {
    let hash = new Set();

    while (n !== 1) {
        n = getSum(n);
        if (hash.has(n)) return false; // 死循环了,终止运行
        hash.add(n);
    }

    return n === 1;
};

var getSum = function (n) {
    let sum = 0;
    while (n > 0) {
        sum += (n % 10) ** 2;
        n = Math.floor(n / 10);
    }
    return sum;
}

快慢指针

解题思路

  1. 由于求和的过程中,有可能会出现重复值,会形成一个环,那么就可以借鉴 leetcode🧑‍💻 141. 环形链表 的解题方式;

  2. 利用快慢指针 fastslow ,由于这里不是指针,向下移动相当于 getSum(n)

    • 如果他们最终相遇则说明存在环,则进一步说明出现了死循环,则不是一个快乐数;
    • 如果他们没有相遇,结果为 1 则是一个快乐数

代码实现

let isHappy = function (n) {
    // 1. 定义快慢指针
    let slow = n;
    let fast = getSum(n);

    // 2. 判断是否有环
    while (fast !== 1) {
        slow = getSum(slow);
        fast = getSum(getSum(fast));

        if (slow === fast) return false; // 有环
    }

    return true;
}

let getSum = function (n) {
    let sum = 0;
    while (n > 0) {
        sum += Math.pow(n % 10, 2);
        n = Math.floor(n / 10);
    }
    return sum;
}

参考资料

  1. 卡尔:《代码随想录》

打赏作者
您的打赏是我前进的动力
微信
支付宝
评论

中午好👏🏻,我是 ✍🏻   疯狂 codding 中...

粽子

这有关于前端开发的技术文档和你分享。

相信你可以在这里找到对你有用的知识和教程。

了解更多

目录

  1. 1. 哈希
    1. 1.1. 解题思路
    2. 1.2. 复杂度
    3. 1.3. 代码实现
  2. 2. 快慢指针
    1. 2.1. 解题思路
    2. 2.2. 代码实现
  3. 3. 参考资料