链接:
738. 单调递增的数字 - 力扣(LeetCode) (leetcode-cn.com)
class Solution {
public int monotoneIncreasingDigits(int n) {
int idx = -1;
//首先将数字转换成String字符串,再将其转成字符数组
char[] strNum = String.valueOf(n).toCharArray();
for(int i=strNum.length-1;i>0;i--){
if(strNum[i]<strNum[i-1]){
strNum[i-1]=(char)(strNum[i-1]-1); // int--->char需要强制类型转换
idx=i;
}
}
if(idx!=-1){
for(int i=idx;i<strNum.length;i++){
strNum[i]='9'; //需要找到最大的递增数字
}
}else{
return n; //类似于1234本身就是递增的情况
}
StringBuilder result=new StringBuilder();
for(int i=0;i<strNum.length;i++){
result.append(strNum[i]);
}
return Integer.valueOf(result.toString());
}
}
思路:
- 1)如果为单调递增的数字,即该数字从左到右看应该是递增序列。将n的每一个数字存放在数组中,从右向左遍历数字,找到第一次出现递减时的位置curIdx(当前位置上的数字小于前一个位置上的数字) , curIdx-1位置上的数字减1,该位置上的数字变为9
- 2)一开始想的是从左到右进行遍历,curIdx-1位置上的数字减1之后和它的上一个位置的数字就不符合要求了。如332--->329,这样操作之后,不符合题意
- 3)从右向左遍历呢?332--->329--->299,倒着遍历可以,因为它可以用到已经更改数字的信息
参考:
代码随想录 (programmercarl.com)