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
相关产品推荐
相关产品推荐

