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).