• LeetCode-228 Summary Ranges


    题目描述

    Given a sorted integer array without duplicates, return the summary of its ranges.

    题目大意

    给定一个有序数组,要求将数组中的数字按照连续数字进行分类表示,即前后连续的数字例如0,1,2,3表示为0->3 。

    示例

    E1

    Input:  [0,1,2,4,5,7]
    Output: ["0->2","4->5","7"]
    Explanation: 0,1,2 form a continuous range; 4,5 form a continuous range.

    E2

    Input:  [0,2,3,4,6,8,9]
    Output: ["0","2->4","6","8->9"]
    Explanation: 2,3,4 form a continuous range; 8,9 form a continuous range.

    解题思路

    遍历一遍数组,利用两个指针进行前后比较,一个记录范围起始数字,另一个表示上一个数字,若仍然连续则将该指针递增,并继续下一个数字判断,否则将两个指针之内的数字表示为合适的字符串并记录在结果中。

    复杂度分析

    时间复杂度:O(N)

    空间复杂度:O(1)

    代码

    class Solution {
    public:
        vector<string> summaryRanges(vector<int>& nums) {
            long n = nums.size(), sta = 0, last = 0;
            vector<string> res;
            if(n <= 1) {
                if(n == 1)
                    insert(res, nums[0], nums[0]);
                return res;
            }
        
            sta = nums[0];
            last = nums[0];
            for(int i = 1; i < n; ++i) {
                // 若前后依然连续,则将last指针递增为当前数字
                if(nums[i] - last == 1)
                    last = nums[i];
                // 若不连续,则把sta和last两个数字表示为合适的字符串加入结果中,并将sta和 
                // last重新赋值
                else {
                    insert(res, sta, last);
                    sta = nums[i];
                    last = nums[i];
                }
            }
            // 由于遍历到最后没有计算最后一段范围,将最后一段范围加入结果中
            insert(res, sta, last);
            
            return res;
        }
        // 将两个数字的范围表示为字符串,并记录到结果中
        void insert(vector<string>& res, long sta, long last) {
            string a = "", b = "";
            // 用来表示两个数字是否为正数
            bool f1 = true, f2 = true;
            // 若其中有数字为负数,应进行将其转为正数方便计算
            if(sta < 0) {
                a += '-';
                sta = -sta;
                f1 = false;
            }
            if(last < 0) {
                b += '-';
                last = - last;
                f2 = false;
            }
            // 若两个数字相同,表示该范围内只有一个数字
            if(sta == last) {
                if(sta)
                    while(sta) {
                        a.insert(f1 ? 0 : 1, 1, '0' + sta % 10);
                        sta /= 10;
                    }
                else
                    a += '0';
                res.push_back(a);
            }
            // 否则,该范围内至少有两个数字
            else {
                if(sta)
                    while(sta) {
                        a.insert(f1 ? 0 : 1, 1, '0' + sta % 10);
                        sta /= 10;
                    }
                else
                    a += '0';
                if(last)
                    while(last) {
                        b.insert(f2 ? 0 : 1, 1, '0' + last % 10);
                        last /= 10;
                    }
                else
                    b += '0';
                res.push_back(a + "->" + b);            
            }
        }
    };
  • 相关阅读:
    文本切换器(TextSwitcher)的功能和用法
    图像切换器(ImageSwitcer)的功能与用法
    ViewSwitcher的功能与用法
    HTTP协议-get请求与post请求的区别
    HTTP协议缓存
    HTTP协议详解
    Vue.js----更换头像不实时更新问题
    Vue.js----date与时间戳的转换(unixTime)Moment.js让日期处理变得更简单
    Let's Encrypt 免费通配 https 签名证书 安装方法
    小程序Openid 获取,服务器 encryptedData 解密 遇到的坑
  • 原文地址:https://www.cnblogs.com/heyn1/p/11089888.html
Copyright © 2020-2023  润新知