• 【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

    输出结果与上例相同。

  • 相关阅读:
    [附源码]SSM计算机毕业设计健身健康规划系统JAVA
    Redis 高可用之持久化
    windows 安装 Android Studio
    建筑设计中,如何快速获得场地的等高线图?
    (二)Three光线检测-实现摄像机向鼠标点击位置滑动动画
    为什么不推荐在Spring Boot中使用@Value加载配置
    【Mac开发环境搭建】安装HomeBrew、HomeBrew安装Docker、Docker安装Mysql5.7和8
    Shell Protocol空投价值几何,一文带你详细分析
    【电源专题】案例:电感电流测试异常难道就一定是电路参数的问题?
    学习FPGA之五:工具链
  • 原文地址:https://blog.csdn.net/qq_54053990/article/details/133815871