我的力扣算法738-单调递增的数字

ok
看题:
在这里插入图片描述
题意很简单,也就是要找一个保证自己在形式上是升序,且最大不超过给出的值的一个数,这里用到的方法是贪心,主要是,先以给出的数为基础,如果满足条件,这就是最大的那个数,如果不是升序,再通过减一进行调整,但是每次调整都保证是当时的最大情况。
代码:

class Solution {
public:
    int monotoneIncreasingDigits(int N) {
        //转换为string类型,方便利用下标获得值
        string ts = to_string(N) ;
        int size = ts.size();
    
        //从左开始找,找到第一个不满足升序条件的下标
        int index = 0;
        while( index < size-1 &&  ts[index]-'0' <= ts[index+1]-'0' )
        {
            index++;
        }
        if( index == size-1 ) return N;//如果没有找到,那么整个字符串自己是满足要求的

        ts[index] = ts[index] - '0' -1 + '0' ;// 这里就是将下标退回到不满足升序条件的上一位,然后减1
        for( int i = index+1 ;i < size ;++i)//如果要保证这个数字合理的进行,就要让后面的数字变大
        {
            ts[i] = '9' ;
        }
        //判断改变后的字符串是否满足升序
        for( int i = index;i > 0;--i )
        {
            if( ts[i] - '0' < ts[i-1] - '0')//在i处不是升序了
            {
                ts[i] = '9' ;//当前下标的数提到最大
                ts[i-1] = ts[i-1] - '0' -1 +'0' ;//前一位数减1
            }
            else
            {
                continue;
            }
        }
        return stoi(ts);
    }
};

ok

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值