算法:
拿一个两位的数字来举例。
例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。
此时是从前向后遍历还是从后向前遍历呢?
举个例子,数字:332:
若从前向后遍历:
那么就变成了329,此时2又小于了第一位的3了,真正的结果应该是299。
若从后向前遍历:
332的数值变化为:332 -> 329 -> 299
所以,从后向前遍历!
正确代码:
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]--;start = i+1;}}for (int i=start; i<s.length();i++){chars[i] = '9';}return Integer.parseInt(String.valueOf(chars));}
}
注意:
1. String s = String.valueOf(n); valueOf:O大写
2.char[] chars = s.toCharArray(); toCharArray()是调用方法,要加括号
3.int start = s.length();而不是 `int start = s.length() - 1;
`
当输入的数字为 223344,假设我们按照 `int start = s.length() - 1;
` 来设置起始索引,那么在第一个 for 循环中,没有chars[i] > chars[i+1],不执行
我们会将 `start
` 设置为 `s.length() - 1
`,即 5。
这将导致在第二个 for 循环中,我们会将从索引 5 设置为 9(223349),这是不正确的,因为实际上我们不需要设置9,223344本身就是单调递增的最大解
4.`Integer.parseInt(String.valueOf(chars))
` 这行代码的作用是将字符数组 `chars
` 转换为字符串,然后将该字符串解析为整数。
这种转换通常用于将字符数组表示的数字转换为整数。例如,如果 `chars
` 是 `['1', '2', '3']
`,那么 `String.valueOf(chars)
` 将创建字符串 `"123"
`,然后 `Integer.parseInt
` 将字符串转换为整数 `123
`。
时间空间复杂度:
时间复杂度为 O(n):
其中 n 是输入数字的位数。算法中的主要操作是将数字转换为字符串,并遍历该字符串一次以找到需要减小的位置。
空间复杂度为 O(n):
主要由字符串 s 和字符数组 chars 所占据的空间决定。