738. 单调递增的数字

738. 单调递增的数字

题目

给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

示例 1:

输入: N = 10
输出: 9
示例 2:

输入: N = 1234
输出: 1234
示例 3:

输入: N = 332
输出: 299
说明: N 是在 [0, 10^9] 范围内的一个整

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/monotone-increasing-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

这个数n的长度我们是不知道的,那么如何获取每个位数的值?

可以转换成数组,高位在前面,低位在后面。

从后往前遍历比较,如231,暴力求解的话,应该先考虑231,230....这样才能返回符合条件的最大整数。并且如果从后往前遍历,修改了个位数的1,那跟着十位也要修改,那是不是还要考虑百位需不需修改?

那么比较之后,如果不符合条件要怎么修改?
条件1:找出小于或等于 N 的最大的整数
条件2:各个位数上的数字是单调递增

1比3小,那么不符合条件2,我们需要取比3大的,取3-9的哪一个?根据条件1,取最大的9并且需要让3-1,不然就不符合条件1了。
如果该位变成了9,那么该位后面的也要全部变成9。需要一个flag记录最后一个变9的位置。

代码

class Solution {
    public int monotoneIncreasingDigits(int n) {
        if(n<10)return n;  
        String num = n + "";
        char[] arr=num.toCharArray();
        int len = arr.length;   
        int flag=len;
        for(int i=len-1;i>0;i--){
            if(arr[i]<arr[i-1]){ //记录变为9的位置
                flag = i;
                arr[i-1] --; //前一位-1
            }
        }
		//变为9的最高位的后面位全部都要为9
         for (int i = flag; i < len; i++) {
            arr[i] = '9';
        }
        return Integer.parseInt(new String(arr));
    }
}
posted @ 2021-08-09 18:13  rananie  阅读(60)  评论(0)    收藏  举报