题目
给定一个无重复元素的有序整数数组 nums 。返回恰好覆盖数组中所有数字的最小有序区间范围列表 。也就是说,nums的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于nums的数字x。
输入: nums = [0,1,2,4,5,7]
输出: ["0->2","4->5","7"]
题解
第一种
我们在函数中首先声明一个空数组res用于存储所有的区间字符串,然后在声明一个变量start来表示当前区间的起始数字和一个end变量来表示当前区间的结束数字,最后声明一个len变量来记录当前区间的长度,接下来我们使用for循环遍历数组nums中的每一个元素,如果当前元素是连续区间中的数字,则更新end变量和len变量的值,如果当前元素不是连续区间中的数字,则将当前区间的字符串表示加入到res数组中,然后重新设置start变量和end变量以及len变量的值,如果当前区间的长度为1,则直接将start变量加入到res数组中,最后将存储所有区间的字符串res数组返回即可
var summaryRanges = function(nums) {
let res = [];
let start = nums[0];
let end;
let len = 1;
for(let i=1;i<nums.length+1;i++){
if(start+len==nums[i]){
end = nums[i];
len++;
}else{
if(len==1){
res.push(start+'');
start = nums[i];
continue;
}
res.push(start+'->'+end);
start = nums[i];
len = 1;
}
}
return res;
};
第二种
我们首先在函数中声明一个空数组res,然后在数组末尾添加一个NaN非数字的值,这种操作是为了确保最后一个数字也能被处理,我们接下来使用两个嵌套的for循环来遍历数组中的数字,第一个循环从第一个数字开始,第二个循环从第二个数字开始,如果当前数字与前一个数字之差等于1,则继续循环,否则我们将当前数字与前一个数字之间的范围添加到res数组中,如果当前数字与前一个数字相等,则只将一个数字添加到res数组中,在循环过程中,每次找到一个范围后,将外层循环的索引值更新为内层循环的索引值减1,以便跳过已经处理过的数字,最后我们将res数组返回出去即可
var summaryRanges = function(nums) {
let res = []
nums.push(NaN);
for(let i=0;i<nums.length-1;i++){
for(let j=i+1;j<nums.length;j++){
if(nums[j] - nums[j-1] == 1){
continue;
}else{
res.push(nums[i] === nums[j-1] ?
`${nums[i]}` : `${nums[i]}->${nums[j-1]}`);
i = j-1;
break;
}
}
}
return res;
};
坚持努力,无惧未来!