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

双水晶球问题O(√n)算法存在异常,求优化方案

双水晶球问题O(√n)算法的修复方案

原代码的核心错误在于第一个for循环的语法结构完全错误,JavaScript的for循环要求三个部分为「初始化语句; 循环条件; 增量语句」,但原代码把循环条件写到了第一个位置,增量语句放到了条件位置,导致循环逻辑混乱,无法正确定位第一个让水晶球破碎的跳跃点,最终出现测试案例返回-1的异常。

修复后的代码

function two_crystal_balls(breaks) {
  const jmpAmount = Math.floor(Math.sqrt(breaks.length));

  // 修正循环结构,正确寻找第一个破碎的跳跃点
  let i = jmpAmount;
  for (; i < breaks.length; i += jmpAmount) {
    if (breaks[i]) {
      break;
    }
  }

  // 回退到上一个跳跃点,作为线性搜索的起始位置
  i -= jmpAmount;
  
  // 线性搜索当前块,同时避免超出数组范围
  for (let j = 0; j < jmpAmount && i < breaks.length; j++, i++) {
    if (breaks[i]) {
      return i;
    }
  }

  // 数组中无破碎点的情况
  return -1;
}

// 测试案例:30个false + 11个true
console.log(two_crystal_balls([
  false, false, false, false, false, false, false, false, false, false,
  false, false, false, false, false, false, false, false, false, false,
  false, false, false, false, false, false, false, false, false, false,
  true, true, true, true, true, true, true, true, true, true, true
])); // 输出31,符合预期

额外边界情况说明

  • 若数组全为true:回退后从索引0开始线性搜索,会正确返回0
  • 若最后一个元素为true:跳跃到超出数组长度后,回退到最后一个块的起始位置,线性搜索到末尾会返回正确索引
  • 若数组全为false:最终返回-1,符合逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 01:02:26