双水晶球问题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
相关产品推荐
相关产品推荐

