Codewars方向简化挑战代码过慢,如何优化JavaScript实现?
代码性能问题分析及优化方案
现有代码的性能问题
- 反复调用
splice修改原数组:splice操作会触发后续数组元素整体重排,单次操作时间复杂度为O(n),数组长度较大时开销极高 - 多次重置遍历下标
i为0,相当于重复遍历数组多轮,最坏情况时间复杂度达到O(n²),输入规模稍大就会触发超时 - 存在无效边界判断:当
i=0时访问arr[i-1]会得到undefined,属于冗余的无效判断
优化方案
这道题是典型的栈结构适用场景,仅需一次遍历即可完成计算,时间复杂度降至O(n)。
核心逻辑:遍历每个方向时,和栈顶存储的方向对比,如果二者为相反方向则弹出栈顶,否则将当前方向压入栈。
优化后代码如下:
function dirReduc(arr){ const opposite = { 'NORTH': 'SOUTH', 'SOUTH': 'NORTH', 'EAST': 'WEST', 'WEST': 'EAST' } const stack = [] for (const dir of arr) { const last = stack.at(-1) if (last && last === opposite[dir]) { stack.pop() } else { stack.push(dir) } } return stack }
优化效果说明
- 仅遍历输入数组一轮,无重复遍历开销
- 所有操作均为栈的O(1)入栈/出栈操作,无数组重排开销
- 逻辑简洁,无冗余判断,稳定性更高
内容的提问来源于stack exchange,提问作者GodOfProgrammers
相关产品推荐
相关产品推荐

