Codewars JS数组基础题:步行校验函数测试不通过调试求助
代码问题定位与修正
核心逻辑错误点
- 坐标计算维度错误:当前代码把水平方向(东/西)和垂直方向(北/南)的位移全部累加在同一个变量
y上,只要变量总和为0就判定回到起点,但实际回到起点需要满足两个独立条件:南北方向位移总和为0(北走的街区数 = 南走的街区数)、东西方向位移总和为0(东走的街区数 = 西走的街区数)。
举个会触发测试失败的输入示例:['n','n','n','n','e','s','w','w','w','w'](共10步)。按当前代码计算,单变量累加结果为41(北)+11(东)-11(南)-41(西)=0,代码会误判为回到起点,但实际最终位置为垂直方向距起点3个街区、水平方向距起点3个街区,完全不满足返回起点的要求。 - 冗余的分支判断:
findEndPosition函数中额外增加了Arr.length >10 返回false的判断,这个判断完全重复了外层walkTime的长度校验逻辑,属于冗余代码,不会直接引发错误但会降低代码可读性。
修正方案
把位移计算拆分为独立的水平、垂直两个维度的计数,同时简化整体逻辑:
- 首先判断路线长度是否严格等于10,不满足直接返回
false - 分别统计南北、东西方向的位移总和:北为正、南为负;东为正、西为负
- 当两个方向的位移总和都为0时,才返回
true,否则返回false
修正后的代码参考
const isValidWalk = (walk) => { // 严格校验步行时长刚好为10分钟 if (walk.length !== 10) return false; // 拆分两个独立维度的位移计数 let x = 0; // 东西方向:东+1,西-1 let y = 0; // 南北方向:北+1,南-1 walk.forEach(step => { switch(step) { case 'n': y++; break; case 's': y--; break; case 'e': x++; break; case 'w': x--; break; } }) // 两个维度位移都为0才代表回到起点 return x === 0 && y === 0; }
内容的提问来源于stack exchange,提问作者juanvicareer
相关产品推荐
相关产品推荐

