查找数组中所有连续数字范围

时间:2019-03-05 17:10:23

标签: javascript arrays algorithm ecmascript-6

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

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")

很抱歉无法更好地解释问题。

1 个答案:

答案 0 :(得分:1)

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

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

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]));