单调递增的数字

在这里插入图片描述
看见这个数字范围就知道不可以使用暴力。这道题先要想清楚,如果不用代码写,用手算会怎么算。
   举个例子:98 最大的单调递增数是多少?那97,96,95,94呢?
先用暴力计算,就是从小于98的数中一个一个对比,97,96…92,91,90,89,找到了那个数就是89.剩下的那些数答案也全都是89
先找一下规律,都是把前一位数-1,然后把后一位数置为9,先试一试其他数看对不对。
  65最大递增的数是多少?
前一位数6-1=5,后一位数置为9,那就是59。用暴力方法确认一下,64,63,62,61,60,59 是正确的,中肯的。
  那么推广到3位数,321呢?
继续上面那个方法,发现2比3小,把3减1,后面置为9就是299,暴力计算一下发现确实是,所以就找到了解题的方法。

从左边开始往后寻找,找到第一个比前一位小的数,然后前一位数减1,继续向前判断减一之后是否比前面的数大。最后把后面的数全部置为9

 public int monotoneIncreasingDigits(int n) {
        if(n<10) return n;
        //转换为字符数组,好操作
        char []ch = String.valueOf(n).toCharArray();
        //从1号位置开始,从0号也行,就是下面的数组位置要改改
        int i = 1;
        //找到x > y的位置,若x<=y 则继续判断下一位
        while( i<ch.length && ch[i] >= ch[i-1]) i++;
        
        //若i == ch.length说明n单调递增
        if(i<ch.length){
            // 判断该位置是否比前一位小
            while(i>0 && ch[i] < ch[i-1]){
                //比前一位小,则前一位数-1,再继续向前判断
                ch[i-1] --;
                i--;
            }
            //把i位置之后的所有数字都置为9
            for(int j = i+1;j<ch.length;j++){
                ch[j] = '9';
            }
        }
        String str = new String(ch);
        int x = Integer.valueOf(str);
        return x;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值