uacs2024

导航

leetcode 228. 汇总区间

228. 汇总区间

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        int size = nums.size();
        if(size == 1)  return {to_string(nums[0])};
        vector<string> res;
        for(int left = 0,right = 0;right < size;){
            while(right < size-1 && nums[right] + 1 == nums[right+1])  ++right;
            if(right == size-1 && nums[right-1] == nums[right])  ++right;
            if(left == right)  res.emplace_back(to_string(nums[left]));
            else  res.emplace_back(to_string(nums[left]) + "->" + to_string(nums[right]));
            ++right;left = right;
        }
        return res;
    }
};

题解中更简洁优雅的写法:

class Solution {
public:
    vector<string> summaryRanges(vector<int>& nums) {
        int size = nums.size();
        vector<string> res;
        for(int left = 0,right = 0;right < size;++right){
            if(right + 1 == size || nums[right] + 1 != nums[right + 1]){
                string str = to_string(nums[left]);
                if(left != right)  str = str + "->" + to_string(nums[right]);
                res.emplace_back(str);
                left = right + 1;
            }
        }
        return res;
    }
};

一般来说,分组循环的模板:

i, n = 0, len(nums)
while i < n:
    start = i
    while i < n and ...:
        i += 1
    # 从 start 到 i-1 是一段
    # 下一段从 i 开始,无需 i+=1

 

posted on 2024-12-13 19:58  ᶜʸᵃⁿ  阅读(17)  评论(0)    收藏  举报