这里的思路比较简单,使用start还有last来分别指向区间的首尾
遍历数组的时候使用当前的数字与last相比
如果差距大于1,那么就要封存当前区间了
如果区间刚好等于1,那么就继续下一个遍历
初版
var summaryRanges = function (nums) {
if (nums.length === 0) return []
if (nums.length === 1) return [nums[0] + '']
let res = []
let start = nums[0]
let last = nums[0]
for (let i = 1; i < nums.length; ++i) {
// 封存当前区间,更新start以及last
if (nums[i] - last > 1) {
if (last === start) {
res.push(start + '')
} else {
res.push(start + '->' + last)
}
start = nums[i]
last = nums[i]
} else {
// 更新last
last = nums[i]
}
}
// 统计最后一个区间
if (last === start) {
res.push(start + '')
} else {
res.push(start + '->' + last)
}
return res
};
优化版
last 可以使用 nums[i-1] 代替
var summaryRanges = function (nums) {
if (nums.length === 0) return []
if (nums.length === 1) return [nums[0] + '']
let res = []
let start = nums[0]
for (let i = 1; i <= nums.length; ++i) {
if (i === nums.length || nums[i] - nums[i - 1] > 1) {
// 最后一个元素与开始相同,那么就是单独的元素
if (start === nums[i - 1]) {
res.push('' + start)
} else {
// 不同则是一个区间
res.push(start + '->' + nums[i - 1])
}
// 进入第一个if则代表此时区间要更替了,此时要替换start
if (i < nums.length) {
start = nums[i]
}
}
}
return res
};