力扣 汇总区间
2021年 1月10日 星期日
题目描述:
给定一个无重复元素的有序整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
列表中的每个区间范围 [a,b] 应该按如下格式输出:
"a->b" ,如果 a != b
"a" ,如果 a == b
示例 1:
输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
解释:区间范围是:
[0,2] --> "0->2"
[4,5] --> "4->5"
[7,7] --> "7"
示例 2:
输入:nums = [0,2,3,4,6,8,9]
输出:["0","2->4","6","8->9"]
解释:区间范围是:
[0,0] --> "0"
[2,4] --> "2->4"
[6,6] --> "6"
[8,9] --> "8->9"
示例 3:
输入:nums = [ ]
输出:[ ]
示例 4:
输入:nums = [-1]
输出:["-1"]
示例 5:
输入:nums = [0]
输出:["0"]
提示:
0 <= nums.length <= 20
-231 <= nums[i] <= 231 - 1
nums 中的所有值都 互不相同
nums 按升序排列
我写的代码是这样的:
1 #include<stdio.h> 2 #include<stdlib.h> 3 char ** summaryRanges(int* nums, int numsSize, int* returnSize){ 4 printf("["); 5 int p = 0; //p是指第几位数 6 for(int i = 0 ; i< numsSize; i ++){ 7 p = i; 8 if(numsSize==1){ //如果数组中只有一个元素,那么直接输出就OK 9 printf("\"%d\"",nums[i]); // 10 break; // 11 } 12 for(; ; i++){ //通过小的循环判断是不是存在下一个数字等于本数字+1 13 if(nums[i+1]!=nums[i]+1){ //如果不等了,即说明数字“断”了,退出小循环 14 break; 15 } 16 } 17 if(p!=i){ //如果a!=b,这样输出 18 printf("\"%d->%d\"",nums[p],nums[i]); 19 } 20 else if(p == i){ //如果a==b,这样输出 21 printf("\"%d\"",nums[i]); 22 } 23 if(i!=numsSize-1){ 24 printf(","); 25 } 26 27 } 28 printf("]"); 29 return 0; 30 } 31 int main(){ 32 int nums[]={0,1,2,4,5,7}; 33 int numsSize = sizeof(nums)/sizeof(int); //求出数组的长度 34 int returnSize[10]; 35 summaryRanges(nums,numsSize,returnSize); 36 return 0; 37 }
说明一下:其中的returnSize数组我没有用,我直接在函数中输出了。。。原因是我看不太懂leetcode想要我输出什么,难道是在int类型的数组中输出带有"->"的?很奇怪。。吐槽
我想了想,试试这样可不可以:例如,应该输出的是["0->2","4->5","7"],我将returnSize数组内填上0,2,4,5,7?试一试叭。
不得不想吐槽一下力扣。。。