【问题标题】:Find all ranges of consecutive numbers in array [closed]查找数组中连续数字的所有范围[关闭]
【发布时间】:2025-12-23 15:50:12
【问题描述】:

给定一个排序的数字数组,如何获得连续数字的范围?该函数应将范围和单个数字作为字符串返回。示例:

function findRanges(arrayOfSortedNumbers) {
  // logic here
}

findRanges([1, 3, 4, 5, 7]) => (expected output: "1, 3-5, 7")

findRanges([1, 2, 3, 5]) => (expected output: "1-3, 5")

findRanges([2, 3, 4, 5, 6]) => (expected output: "2-6")

很抱歉未能更好地解释问题。

【问题讨论】:

  • (expected output: 真实代码 ) minimal reproducible example
  • 请编辑您的问题并提供您迄今为止尝试过的内容?
  • 来个提示怎么样。 1 - 对数组进行排序 2 - 从数组中的第一个元素开始向前走 3 - 如果下一项是前一项 + 1 则继续走 4 - 否则,将您刚刚发现的范围添加到结果数组中 5 - 继续您当前的项目作为新的第一个项目。 6 - 其余的你应该能够弄清楚

标签: javascript arrays algorithm ecmascript-6


【解决方案1】:

你可以使用Array.reduce()来做到这一点:

  1. 对数组进行排序(安全)
  2. 使用reduce 遍历数组以创建一个包含ranges 和活动范围起点(rangeStart) 的对象。
  3. 在第一次迭代中,将第一个元素压入范围并将该元素保存为rangeStart
  4. 在连续迭代中,如果该值等于最后一个值 + 1,则我们处于同一范围内,因此我们通过更改 ranges 数组中的最后一个值来更新它。否则,我们将元素推入ranges 数组,并将rangeStart 更新为该元素。
  5. 返回reduce输出的对象的ranges属性,并用逗号连接。

function findRanges(numbers) {
  return [...numbers].sort((a, b) => a - b).reduce((acc, x, i) => {
    if (i === 0) {
      acc.ranges.push(x);
      acc.rangeStart = x;
    } else {
      if (x === acc.last + 1) {
        acc.ranges[acc.ranges.length-1] = acc.rangeStart + '-' + x;
      } else {
        acc.ranges.push(x);
        acc.rangeStart = x;
      }
    }
    acc.last = x;
    return acc;
  }, { ranges: [] }).ranges.join(', ');
}

console.log(findRanges([1, 3, 4, 5, 7]));
console.log(findRanges([1, 2, 3, 5]));
console.log(findRanges([2, 3, 4, 5, 6]));

【讨论】: