LeetCode 228. 汇总区间(C、C++、python)

本文介绍了一种针对无重复元素的有序整数数组,实现区间范围汇总的算法。通过示例展示,如输入[0,1,2,4,5,7],输出[0->24->57],以及输入[0,2,3,4,6,8,9],输出[02->468->9]。文章提供了C、C++和Python三种语言的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个无重复元素的有序整数数组,返回数组区间范围的汇总。

示例 1:

输入: [0,1,2,4,5,7]
输出: ["0->2","4->5","7"]
解释: 0,1,2 可组成一个连续的区间; 4,5 可组成一个连续的区间。

示例 2:

输入: [0,2,3,4,6,8,9]
输出: ["0","2->4","6","8->9"]
解释: 2,3,4 可组成一个连续的区间; 8,9 可组成一个连续的区间。

C

/**
 * Return an array of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
char** summaryRanges(int* nums, int numsSize, int* returnSize) 
{
    int n=numsSize;
    char** res=NULL;
    if(n==0)
    {
        *returnSize=0;
        return res;
    }
    else if(n==1)
    {             
        res=(char**)malloc(sizeof(char*));
        res[0]=(char*)malloc(sizeof(char)*255);
        sprintf(res[0],"%d",nums[0]);
        *returnSize=1;
        return res;
    }
    else
    {   
        res=(char**)malloc(sizeof(char*)*n);
        for(int i=0;i<n;i++)
        {
            res[i]=(char*)malloc(sizeof(char)*255);
        }
        int k=0;
        int count=0;
        int aa=nums[0];
        for(int i=1;i<n;i++)
        {
            if(nums[i]-nums[i-1]==1)
            {
                count++;
            }
            else
            {
                if(count==0)
                {
                    sprintf(res[k],"%d",aa);
                    k++;
                    aa=nums[i];
                }
                else
                {
                    sprintf(res[k],"%d%s%d",aa,"->",aa+count);
                    k++;
                    count=0;
                    aa=nums[i];
                }
            }
            if(count==0)
            {
                sprintf(res[k],"%d",aa);
            }
            else
            {
                sprintf(res[k],"%d%s%d",aa,"->",aa+count);
            }
            *returnSize=k+1;
        }
        return res;
    }
}

C++

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) 
    {
        vector<string> res;
        int n=nums.size();
        for(int i=0;i<n;i++)
        {
            nums[i]=(long long)nums[i];
        }
        if(0==n)
        {
            return res;
        }
        string tmp=to_string(nums[0]);
        int start=0;
        for(int i=1;i<n;i++)
        {
            if(nums[i]!=nums[i-1]+1)
            {
                if(i==start+1)
                {
                    res.push_back(tmp);
                    start=i;
                    tmp=to_string(nums[i]);
                }
                else
                {
                    tmp+="->";
                    tmp+=to_string(nums[i-1]);
                    res.push_back(tmp);
                    start=i;
                    tmp=to_string(nums[i]);
                }
            }
        }
        if(start==n-1)
        {
            res.push_back(tmp);
        }
        else
        {
            tmp+="->";
            tmp+=to_string(nums[n-1]);
            res.push_back(tmp);
        }
        return res;
    }
};

python

class Solution:
    def summaryRanges(self, nums):
        """
        :type nums: List[int]
        :rtype: List[str]
        """
        n=len(nums)
        res=[]
        count=0
        if n==0:
            return res
        elif n==1:
            temp=str(nums[0])
            res.append(temp)
            return res
        else:
            aa=nums[0]
            temp=str(nums[0])
            for i in range(1,n):
                if nums[i]-nums[i-1]==1:
                    count += 1
                else:
                    if count==0:
                        res.append(temp)
                        aa=nums[i]
                        temp=str(nums[i])
                    else:
                        temp+="->"
                        temp+=str(aa+count)
                        res.append(temp)
                        aa=nums[i]
                        count=0
                        temp=str(nums[i])
            if count==0:
                res.append(temp)
            else:
                temp+="->"
                temp+=str(aa+count)
                res.append(temp)
            return res;
                        
        

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值