You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode 202快乐数实现:while循环无法终止问题求助

问题分析与修复方案

核心问题1:findSum函数中的无限循环

你的findSum函数里,n = n/10用的是浮点数除法,比如输入n=2时:

  • 第一次循环:rem=2,sum=4,n变成0.2
  • 第二次循环:n=0.2不等于0,rem=Math.floor(0.2%10)=0,sum保持4,n变成0.02
  • 后续循环n会变成0.002、0.0002...永远不会等于0,导致这个while循环永远停不下来。

解决方法:把n = n/10改成整数除法,用Math.floor(n/10)或者n = ~~(n/10),确保n每次都被转为整数,最终会变成0。

核心问题2:未实现循环检测逻辑

你提到要把平方和存入数组检测循环,但当前代码完全没做这个判断。如果输入是2这类非快乐数,修正findSum后,外层while循环会一直计算平方和,进入无限循环(因为会陷入固定的循环链,比如2→4→16→37→58→89→145→42→20→4...永远到不了1)。

解决方法:每次计算新的平方和后,先检查是否已经存在于storeNum数组中,如果存在说明进入循环,直接返回false;如果不存在再存入数组。另外,storeNum应该放在函数内部作为局部变量,避免多次调用函数时残留之前的数据。

修复后的完整代码

var isHappy = function(n) {
    const storeNum = []; // 改为局部变量,避免污染
    while(n > 1){
        n = findSum(n);
        if(storeNum.includes(n)){ // 检测循环
            return false;
        }
        storeNum.push(n);
    }
    if(n === 1){
       console.log("HAPPY NUMBER");
       return true;
    }
    return false;
};

function findSum(n) {
    let sum = 0;
    while(n !== 0){
        const rem = Math.floor(n % 10);
        sum += rem * rem;
        n = Math.floor(n / 10); // 改为整数除法
    }
    return sum;
}

额外优化建议

用数组检测循环的时间复杂度是O(n),可以换成哈希集合(Set),检测存在的时间复杂度是O(1),效率更高:

var isHappy = function(n) {
    const seen = new Set();
    while(n !== 1 && !seen.has(n)){
        seen.add(n);
        n = findSum(n);
    }
    return n === 1;
};

function findSum(n) {
    let sum = 0;
    while(n !== 0){
        const rem = n % 10; // 这里不需要Math.floor,因为n是整数,n%10结果也是整数
        sum += rem * rem;
        n = Math.floor(n / 10);
    }
    return sum;
}

内容的提问来源于stack exchange,提问作者Anchal Gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 04:27:03