• 【Leetcode】 738. 单调递增的数字


    当且仅当每个相邻位数上的数字 xy 满足 x <= y 时,我们称这个整数是单调递增的。

    给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增

    示例 1:

    输入: n = 10
    输出: 9

    示例 2:

    输入: n = 1234
    输出: 1234

    示例3 :

    输入: n = 332
    输出: 299

    提示:

    0 <= n <= 109
    
    • 1

    AC:

    /*
     * @lc app=leetcode.cn id=738 lang=cpp
     *
     * [738] 单调递增的数字
     */
    
    // @lc code=start
    class Solution {
    public:
        int monotoneIncreasingDigits(int n) {
            string str = to_string(n);
            int flag = str.size();
            for(int i = str.size() - 1; i > 0; i--) {
                if(str[i - 1] > str[i]) {
                    str[i - 1]--;
                    flag = i;
                }
            }
            for(int i = flag; i < str.size(); i++) {
                str[i] = '9';
            }
            return stoi(str);
        }
    };
    // @lc code=end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    AC

    需要注意的点:整数型转字符串操作以及字符串转整数操作


    • C++11引入了std::to_string函数,可以将数字类型转换为字符串类型。使用方法如下:
    #include 
    #include 
    
    int main() {
        int i = 123;
        std::string s = std::to_string(i);
        std::cout << s << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果为:

    123
    
    • 1

    底层逻辑:

    • 在实现上,std::to_string调用了std::stringstream,将数值类型转换为字符串类型。可以理解为它是一个基于流的解决方案,也可以通过以下方式手动转换:
    #include 
    #include 
    #include 
    
    int main() {
        int i = 123;
        std::stringstream ss;
        ss << i;
        std::string s = ss.str();
        std::cout << s << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    输出结果与上例相同。


    • C++11引入了std::stoi函数,可以将字符串转换为整型。使用方法如下:
    #include 
    #include 
    
    int main() {
        std::string s = "123";
        int i = std::stoi(s);
        std::cout << i << std::endl;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    输出结果为:

    123
    
    • 1

    如果字符串无法转换为整型,则会抛出std::invalid_argumentstd::out_of_range两种异常。例如:

    #include 
    #include 
    
    int main() {
        std::string s = "abc";
        try {
            int i = std::stoi(s);
            std::cout << i << std::endl;
        }
        catch (const std::invalid_argument& ia) {
            std::cerr << "Invalid argument: " << ia.what() << std::endl;
        }
        catch (const std::out_of_range& oor) {
            std::cerr << "Out of range: " << oor.what() << std::endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    输出结果为:

    Invalid argument: stoi
    
    • 1

    底层逻辑:

    • 在实现上,std::stoi使用了std::strtol函数,将字符串转换为长整型,然后进行类型转换。它还使用了std::locale,允许指定特定的本地化设置来解析字符串。可以理解为它是一个更简单的基于C函数的解决方案,也可以通过以下方式手动转换:
    #include 
    #include 
    #include 
    
    int main() {
        std::string s = "123";
        char* end;
        int i = std::strtol(s.c_str(), &end, 10);
        if (*end == '\0') {
            std::cout << i << std::endl;
        }
        else {
            std::cerr << "Invalid argument" << std::endl;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    输出结果与上例相同。

  • 相关阅读:
    番外番外——猜数字游戏
    MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程
    三维目标检测之OpenPCDet环境配置及demo测试
    【毕业设计】时间序列天气预测系统 - LSTM
    【全开源】JAVA情侣扭蛋机情侣游戏系统源码支持微信小程序+微信公众号+H5
    南阳市卧龙区中医院综合楼施工组织设计及投标报价
    Web前端-Vue2+Vue3基础入门到实战项目-Day5(路由进阶, 案例 - 面经基础版)
    关于人力外包公司那些事
    Qt源码分析--QObject(4)
    VsCode集成Python开发环境
  • 原文地址:https://blog.csdn.net/qq_54053990/article/details/133815871