合并连续数字

将数组中的连续数字合并为区间表示

问题

将数组中连续的数字合并成区间格式,非连续的数字保持独立。

示例:[1,2,3,4,6,7,9,13,15] => ['1->4','6->7','9','13','15']

解答

function shortenArray(arr) {
  // 处理边界
  if (!Array.isArray(arr) || arr.length <= 1) {
    return arr;
  }

  const result = [];
  let start = 0; // 连续数字的开始位置
  let last = 0;  // 连续数字的结束位置

  function pushArr(arrStart, arrEnd) {
    if (arrStart === arrEnd) {
      result.push(arr[arrStart].toString());
    } else {
      result.push(`${arr[arrStart]}->${arr[arrEnd]}`);
    }
  }

  // 遍历数组,判断是否连续
  for (let i = 1; i < arr.length; i++) {
    const temp = arr[i];
    if (arr[last] + 1 === temp) {
      // 连续,更新结束位置
      last = i;
    } else {
      // 不连续,保存当前区间
      pushArr(start, last);
      start = i;
      last = i;
    }
  }

  // 处理最后一个区间
  pushArr(start, last);

  return result;
}

关键点

  • 使用 startlast 记录连续区间的起止位置
  • 判断相邻元素是否连续:arr[last] + 1 === arr[i]
  • 遇到不连续时保存当前区间,重置起止位置
  • 循环结束后需要处理最后一个区间