合并连续数字
将数组中的连续数字合并为区间表示
问题
将数组中连续的数字合并成区间格式,非连续的数字保持独立。
示例:[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;
}
关键点
- 使用
start和last记录连续区间的起止位置 - 判断相邻元素是否连续:
arr[last] + 1 === arr[i] - 遇到不连续时保存当前区间,重置起止位置
- 循环结束后需要处理最后一个区间
目录