You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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']
原有代码问题
  1. 循环过程中调用splice修改原数组,数组长度动态变短后索引i仍正常递增,会跳过部分元素的检查,导致合并逻辑错误
  2. 未判断arr[i+1]是否存在,遍历到最后一个元素时访问arr[i+1]会出现数组越界报错
  3. 默认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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:48:01