JavaScript代码崩溃、浏览器冻结:Coderbyte控制台不执行但提交有效
问题根源:无限死循环导致浏览器卡死
你的代码之所以让Chrome、Firefox浏览器冻结,核心原因是触发了无限死循环——咱们来拆解下问题:
在while (num !== 6174)循环里,你只在函数开头计算了一次numOrdered和numReversed,后续循环中没有基于更新后的num重新生成这两个值。也就是说,一旦第一次计算出的num不是6174,循环就会一直重复执行同一个减法操作,永远跳不出循环,浏览器主线程被占满,自然就卡死了。
修复后的代码
我们需要把生成有序、逆序数字的逻辑放到循环内部,每次迭代都基于当前的num重新计算,同时还要处理4位数字补零的问题(卡普雷卡常数规则针对4位数字):
function KaprekarsConstant(num) { let tries = 0; while (num !== 6174) { // 把数字补全为4位(比如输入123要转为0123) const numStr = num.toString().padStart(4, '0'); // 生成升序和降序的数字 const numOrdered = Number(numStr.split('').sort().join('')); const numReversed = Number(numStr.split('').sort().reverse().join('')); // 更新当前num值 num = numReversed - numOrdered; tries += 1; } return tries; }
额外优化点
- 变量作用域:你原来把
numOrdered、numReversed、tries放在全局作用域,多次调用函数时会出现变量污染问题,建议放到函数内部用let声明。 - 4位补零:如果输入数字不足4位(比如123),必须补前导零才能符合卡普雷卡常数的计算规则,否则会出现逻辑错误。
为什么Coderbyte提交能成功?
大概率是Coderbyte的测试用例刚好是一次计算就得到6174的场景(比如输入6174本身,或者输入一个单次减法就能得到6174的数字),这时候循环只执行0次或1次就结束了,不会触发死循环。但如果遇到需要多次迭代的测试用例,你的代码同样会在他们的环境中超时,只是提交系统没暴露这个问题而已。
内容的提问来源于stack exchange,提问作者ralcala
相关产品推荐
相关产品推荐

