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

LeetCode 1496 Path Crossing JS代码循环i未正常递增问题求助

路径交叉题代码bug修复

现存问题点

  • 逻辑顺序倒置:当前代码是先修改x/y坐标值,再判断坐标是否重复,且存入集合的是移动前的旧坐标,完全不符合访问记录的判断逻辑
  • 分支非互斥:四个方向判断用了独立的if而非else if,第一个分支执行完i自增后,后续分支会用新的i值重复匹配方向,导致单轮循环多次修改坐标、i值异常跳变
  • 初始状态缺失:起点(0,0)没有提前加入访问记录,无法判断走回原点的交叉情况
  • 循环边界错误:i <= directions.length的终止条件会让最后一轮循环取到undefined的方向值,四个分支都不命中时直接进入死循环
  • 性能冗余:用对象存坐标、每次取全量值做includes判断时间复杂度为O(n²),完全没必要,用Set存访问过的坐标字符串可以把存在性判断降到O(1)

修正后代码

var isPathCrossing = function (path) {
  const visited = new Set();
  let x = 0, y = 0;
  // 存入初始起点
  visited.add(`${x},${y}`);
  for (const dir of path) {
    // 根据方向移动坐标
    switch(dir) {
      case 'N': y++; break;
      case 'S': y--; break;
      case 'E': x++; break;
      case 'W': x--; break;
    }
    const curCoord = `${x},${y}`;
    // 判断当前坐标是否访问过
    if (visited.has(curCoord)) return true;
    visited.add(curCoord);
  }
  return false;
};

// 测试用例
console.log(isPathCrossing('NNNNN')); // false
console.log(isPathCrossing('NES')); // false
console.log(isPathCrossing('NESWNEENW')); // true

逻辑说明

修正后去掉了冗余的split+map操作和手动控制i的while循环,用for of直接遍历方向字符,每轮只处理一个方向:先移动到新坐标,再判断是否已经访问过,是就直接返回路径交叉,否则把新坐标加入访问集合,遍历完所有方向都没重复就返回false。如果要进一步精简代码,还可以用方向偏移映射表替换switch分支,进一步压缩多判断逻辑,上述版本优先保证可读性和逻辑正确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 01:27:26