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
相关产品推荐
相关产品推荐

