JS实现数组相邻带数字D字符串合并功能问题求解
需求说明
输入是仅包含三类字符串的JS数组:带数字的L、带数字的R、带数字的D,字符串可重复。要求将相邻的D项合并为单个D项,合并后D的数值等于所有相邻D的数值之和,非相邻D无需合并。
示例如下:
输入: ['D1', 'D1', 'L1', 'D1', 'D1', 'D1', 'R1'] 输出: ['D2', 'L1', 'D3', 'R1'] 输入: ['R1', 'D1', 'L1', 'D1', 'D1', 'D1', 'D1', 'L1', 'R1', 'D1', 'D1', 'D1'] 输出: ['R1', 'D1', 'L1', 'D4', 'L1', 'R1', 'D3']
原有代码问题
- 循环过程中调用
splice修改原数组,数组长度动态变短后索引i仍正常递增,会跳过部分元素的检查,导致合并逻辑错误 - 未判断
arr[i+1]是否存在,遍历到最后一个元素时访问arr[i+1]会出现数组越界报错 - 默认D后的数字仅为1位,无法处理D10、D123这类多位数场景
正确实现
推荐直接构造新数组的方案,避免修改原数组带来的索引混乱问题,逻辑更简洁稳定:
function reduceD(arr) { const result = [] for (const item of arr) { // 非D开头直接加入结果数组 if (item[0] !== 'D') { result.push(item) continue } // 提取当前D的数值 const num = Number(item.slice(1)) const lastItem = result.at(-1) // 结果数组最后一项也是D,直接合并 if (lastItem?.[0] === 'D') { const lastNum = Number(lastItem.slice(1)) result[result.length - 1] = `D${lastNum + num}` } else { // 不是的话直接加入 result.push(item) } } return result }
代码验证
代入示例输入可得到完全匹配的输出,同时支持D后多位数的场景,无越界、索引混乱问题。
内容的提问来源于stack exchange,提问作者Natalia Grzywacz
相关产品推荐
相关产品推荐

