给定一个排序的数字数组,如何获得连续数字的范围?该函数应将范围和单个数字作为字符串返回。示例:
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")
很抱歉无法更好地解释问题。
答案 0 :(得分:1)
您可以使用Array.reduce()
来做到这一点:
reduce
遍历数组以创建一个包含ranges
和有效范围的起始位置(rangeStart
)的对象。rangeStart
ranges
数组中的最后一个值来对其进行更新。否则,我们将元素推入ranges
数组中,并将rangeStart
更新为该元素。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]));