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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:19:23