LeetCode Day39

86 阅读1分钟

738. 单调递增的数字

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

示例 1: 输入: n = 10 输出: 9 示例 2: 输入: n = 1234 输出: 1234 示例 3: 输入: n = 332 输出: 299

思路

  1. 转换为数组:首先,我们需要将给定的整数 n 转换为一个数组 digits,这样每一位数字都可以单独处理。
  2. 找拐点并修正:接着,我们从高位到低位遍历这个数组。如果我们找到一位数字比它右边的数字大(我们称之为“拐点”),我们就减少这一位数字(即将其减 1),并且将这一位右边的所有数字都设置为 9。
  3. 转回为整数:最后,我们将修正后的数组转回为一个整数。

题解

class Solution {
public:
    int monotoneIncreasingDigits(int n) {
        vector<int> digits;
        int original_n = n;
        
        // 步骤1:将整数转换为数字数组
        while (n > 0) {
            digits.push_back(n % 10);
            n /= 10;
        }
        reverse(digits.begin(), digits.end());
        
        int len = digits.size();
        
        // 步骤2:找到第一个拐点
        int i;
        for (i = len - 1; i > 0; --i) {
            if (digits[i] < digits[i - 1]) {
                // 步骤3:调整数字
                --digits[i - 1];
                for (int j = i; j < len; ++j) {
                    digits[j] = 9;
                }
            }
        }        
        // 步骤4:将数字数组转回为整数
        int result = 0;
        for (int d : digits) {
            result = result * 10 + d;
        }
        
        return result;
    }
};