给定一个 无重复元素 的 有序 整数数组 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"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>char** summaryRanges(int* nums, int numsSize, int* returnSize)
{char **p = malloc(sizeof(char*)*numsSize);*returnSize = 0;//先将数组元素个数置0int i = 0;while(i < numsSize){int pos = i;//定义初始位置i++;while(i < numsSize && nums[i] == nums[i - 1] + 1)//如果i小于数组的长度并且数组i的元素等于数组i元素+1{i++;//继续往下判断}int end = i - 1;//不相等的位置char *s = malloc(sizeof(char)*30);//开辟一个一维数组装值sprintf(s,"%d",nums[pos]);//将开始位的值装入if(pos < end)//存在两个连续的数{sprintf(s + strlen(s),"->");sprintf(s + strlen(s),"%d",nums[end]);}p[(*returnSize)++] = s; }return p;
}int main()
{int nums[] = {0,1,2,4,5,7};int numsSize = sizeof(nums)/sizeof(nums[0]);int returnSize = 0;char **s = summaryRanges(nums,numsSize,&returnSize);for(int i = 0;i < returnSize;i++)printf("%s ",s[i]);printf("\n");free(s);s = NULL;return 0;
}