zoukankan      html  css  js  c++  java
  • 2020-12-15 单调递增的数字

    题目


    解题方法

    贪心法

    采用贪心的思想解决该问题,对于输入(N),先将其转换为字符串(digit)(方便索引与修改)。
    从高位向低位遍历,直至碰到第一个元素(digit[i]),使得(digit[i]>=digit[i-1]),将(digit[i-1])的值减去(1),再将低位上的数都改为(9)。但是,可能碰到这种情况:(digit[i-1])减掉(1)后使得(digit[i-1]<digit[i-2]),因而破坏了单调递增的条件,因此在进行了上述操作之后,还要往前回溯直到找到下标(jleft(0<j<digit.size() ight))使得(digit[j]-1 >= digit[j-1]),然后将(j)之后的低位上的数都改为(9)

    class Solution {
    public:
        int monotoneIncreasingDigits(int N) {
            if (N < 10)
                return N;
    
            string digit = to_string(N);      // 将N转化为字符串
            int i = 1;
            while (i < digit.size() && digit[i-1] <= digit[i]) { 
                i++;            // 从高位往低位遍历,寻找破坏单调递增条件的元素
            }
    
            if (i < digit.size()) {      // 若找到了
                while (i > 0 && digit[i-1] > digit[i]) {
                    digit[i-1] -= 1;    
                    i--;
                }
    
                for (i += 1; i < digit.size(); i++) {
                    digit[i] = '9';
                }
            }
    
            return stoi(digit);      // 将字符串转换为整数
        }
    };
    

    提交结果


    总结

    在解决本题时使用了贪心的思想,从高位往低位遍历,尽可能地使得到的值最大。
    在编写代码时使用了两个库函数to_string()stoi(),这两个函数的LLVM实现在这里
    努力看了一下实现源码,发现看不懂:(,待以后进一步学习C++模板等内容了再看吧。

    CS专业在读,热爱编程。
    专业之外,喜欢阅读,尤爱哲学、金庸、马尔克斯。
  • 相关阅读:
    3.30 DOM操作
    3.29 js例题
    3.28 函数
    3.27 数组例题
    Web 条件查询、分页查
    web页面增、删、改
    JDBC事务、下拉框
    JSTL、断点、JavaEE、DBUTils连接池
    jsp、el表达式
    Session技术 、jsp页面
  • 原文地址:https://www.cnblogs.com/jmhwsrr/p/14140602.html
Copyright © 2011-2022 走看看