算法训练Day37|738.单调递增的数字 (和自己和解了,把难题都过滤掉...)

48 阅读1分钟

LeetCode:738. 单调递增的数字 - 力扣(LeetCode)

1.思路

将数字转化为字符串,对字符串进行前后数字进行比较,当前字符串大于后面字符串时,当前字符数值-1,同时更新要修改字符的起始位置,后续要修改的值全部置为9。

2.代码实现
// 很奇怪,暴力解法都想不起来,是不是打心底认为太low了啊...
class Solution {
    public int monotoneIncreasingDigits(int n) {
        while (!isValid(n)) {
            n--;
        }
        return n;
    }
    private boolean isValid(int n) {
        String str = String.valueOf(n);
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) > str.charAt(i + 1)) {
                return false;
            }
        }
        return true;
    }
}
// 
class Solution {
    public int monotoneIncreasingDigits(int n) {
        String s = String.valueOf(n); // 将数字转化为字符串
        char[] chars = s.toCharArray(); // 将字符串转化为字符数组
        int start = s.length(); // 记录需要修改的起始位置
        for (int i = s.length - 2; i >= 0; i--) {
            if (chars[i] > chars[i + 1]) { // 如果当前字符数值大于后面数值
                chars[i]--; // 当前字符-1
                start = i + 1; // 记录需要修改的起始位置为当前位置的下一位置
            }
        }
        // 将需要修改位置后面的字符都变为'9'
        for (int i = start; i < s.length(); i++) {
            chars[i] = '9';
        }
        // 将字符数组转化为字符串,将字符串转化为数字
        return Integer.parseInt(String.valueOf(chars));
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(n).