Codewars十分钟步行问题代码异常求助,求排查逻辑问题
十分钟步行问题代码逻辑排查
我正在解决十分钟步行问题,当前代码无法正常运行,不清楚实现逻辑哪里出错了。
题目描述:你生活在道路呈完美网格布局的Cartesia城,某次赴约提前了十分钟,于是决定散步。城市为市民提供的步行生成APP每次会返回一个由单字符字符串组成的方向数组(例如['n', 's', 'w', 'e']),每个方向代表走一个街区,耗时1分钟。请实现一个函数,判断APP给出的步行路线是否恰好耗时10分钟且能回到起点,满足则返回true,否则返回false。
注意:输入始终是包含'n'、's'、'e'、'w'的有效非空数组。
我的代码:
function isValidWalk(walk) { if(walk.length > 10 || walk.length < 10){ return false }else (walk.splice(0,5).join('') == walk.splice(5,5).map(x=>{ if(x =='s'){ return 'n' }else if(x=='n'){ return 's' } else if(x=='w'){ return'e' } else if(x=='e'){ return 'w' } }).join('')) return true }
问题分析
splice方法误用导致数组破坏
splice是直接修改原数组的方法,执行walk.splice(0,5)取出前5个元素后,原walk数组只剩下后5个元素。此时再执行walk.splice(5,5),因数组长度仅为5,索引5超出范围,会返回空数组,后续的map转换和字符串比较完全失效。核心判断逻辑错误
else分支里的比较语句没有与return绑定,不管比较结果是true还是false,后续的return true都会无条件执行,等于直接忽略了判断逻辑。而且你的思路(前5步和后5步反向相等)本身就不成立——回到起点只需要n和s的数量相等、e和w的数量相等,和步数的前后顺序无关,比如有效路线['n','n','s','s','e','e','w','w','n','s']就不满足前5步与后5步反向相等的条件,但确实能回到起点。
修正后的代码
方案一:计数法(性能更优)
function isValidWalk(walk) { if (walk.length !== 10) return false; let north = 0, south = 0, east = 0, west = 0; for (const dir of walk) { switch(dir) { case 'n': north++; break; case 's': south++; break; case 'e': east++; break; case 'w': west++; break; } } return north === south && east === west; }
方案二:filter简洁写法
function isValidWalk(walk) { return walk.length === 10 && walk.filter(d => d === 'n').length === walk.filter(d => d === 's').length && walk.filter(d => d === 'e').length === walk.filter(d => d === 'w').length; }
内容的提问来源于stack exchange,提问作者Sarkhan Hadjibayov
相关产品推荐
相关产品推荐

