代码随想录算法训练营第三十七天| 738.单调递增的数字

单调递增的数字

题目链接:力扣

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

所以我们要进行从后向前的遍历

一开始的时候看了卡哥的思路写代码还是犯了错误,写出了如下的错误代码:

class Solution {
public:
    int monotoneIncreasingDigits(int n) {

         string Num = to_string(n);

         for(int i= Num.size()-1; i >0; i--)
         {
             if(Num[i-1] > Num[i])   //若前一个数字比后一个数字打
             {
                 Num[i-1] = Num[i-1]-1;
                 Num[i] = '9';
             }
         }

         return stoi(Num);

    }
};

错误之处在于当输入为100时,按上述代码就会输出90,然而实际上应该输出99。
这里需要设置一个变量用于记录从哪位开始,后面全部赋值为9。

正确代码如下:
这里,temp用于记录从哪位开始全部赋值为9,同时一开始将temp设为Num.size()是考虑当输入的数字本身就是单调递增的情况。

class Solution {
public:
    int monotoneIncreasingDigits(int n) {

         string Num = to_string(n);
         int temp = Num.size();

         for(int i= Num.size()-1; i >0; i--)
         {
             if(Num[i-1] > Num[i])   //若前一个数字比后一个数字打
             {
                 temp = i;
                 Num[i-1] = Num[i-1]-1;
             }
         }

         for(int i=temp; i<Num.size();i++)
            Num[i]='9';

         return stoi(Num);

    }
};


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值