给定一个 无重复元素 的 有序 整数数组 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;//先将数组元素个数置0
int 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;
}