738. 单调递增的数字
当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。 给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。
示例 1: 输入: n = 10 输出: 9 示例 2: 输入: n = 1234 输出: 1234 示例 3: 输入: n = 332 输出: 299
思路
- 转换为数组:首先,我们需要将给定的整数
n转换为一个数组digits,这样每一位数字都可以单独处理。 - 找拐点并修正:接着,我们从高位到低位遍历这个数组。如果我们找到一位数字比它右边的数字大(我们称之为“拐点”),我们就减少这一位数字(即将其减 1),并且将这一位右边的所有数字都设置为 9。
- 转回为整数:最后,我们将修正后的数组转回为一个整数。
题解
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;
}
};