题目
给定一个无重复元素的有序整数数组 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; };