题目
解题思路
思路:贪心思路,从前往后找到不符合条件的位置,然后把这个位置的数-1,然后这个位置后面的数全部改为9
循环反复即可,代码有点长,注释很齐全。
加油,再多努力!
代码
class Solution {
public int monotoneIncreasingDigits(int N) {
int res = N;
while(res!=0) {
if(isLeagal(res)) //先判断这个数是否已经符合题目要求
return res; //符合就直接返回 res
int[] num = desprate(res); //把 res的每位划分到一个数组中
int len = num.length;
for(int i = 0;i<len-1;i++){
if(num[i]>num[i+1]){ // 找到从前往后不符合题目条件的下标
num[i]--; //该位 变为 该位的数字-1
for(int j = i+1;j<len;j++){ //后面的数全部改成 9 (贪心思想)
num[j] = 9;
}
break;
}
}
//经过之前的操作后重置 res
//比如 res = 963856657, 则经过之前的步骤后 res = 899999999
res = 0;
for(int i = 0;i<len;i++){
res = num[i]*(int)(Math.pow(10,len-i-1)) + res;
}
}
return res;
}
//得到 res 有多少位, 比如 123 就是 位, 12345 就是 5 位
public int getResNum(int res) {
int cnt = 0;
while(res != 0){
cnt++;
res /= 10;
}
return cnt;
}
//将这个数划分到数组中, 比如 1234 就变成 [1,2,3,4]
public int[] desprate(int res){
int len = getResNum(res);
int[] num = new int[len];
int cnt = 0;
while(res != 0 && len>0) {
int tmp = res / (int)Math.pow(10,len-1);
num[cnt++] = tmp;
res -= tmp * Math.pow(10,len-1);
len--;
}
return num;
}
//判断 res 是否符合题目要求,从小到大各个数位按照从小到大递增
public boolean isLeagal(int res){
int[] num = desprate(res);
boolean flag = true;
for(int i = 0; i < num.length-1; i++) {
if(num[i]>num[i+1]) {
flag = false;
break;
}
}
return flag;
}
}
坚持分享,坚持原创,喜欢博主的靓仔靓女们可以看看博主的首页博客!
您的点赞与收藏是我分享博客的最大赞赏!
博主博客地址: https://blog.csdn.net/weixin_43967679