738.单调递增的数字

'''
Description:  738.单调递增的数字
Autor: 365JHWZGo
Date: 2021-11-10 09:34:56
LastEditors: 365JHWZGo
LastEditTime: 2021-11-10 14:55:40
'''


class Solution(object):
    def monotoneIncreasingDigits(self, n):
        """
        :type n: int
        :rtype: int
        """ 
        strN = str(n)
        f = strN[0]
        first = 0
        length = 0
        for i in range(1, len(strN)):
            if int(strN[i]) < int(f):                               
                break
            elif int(strN[i]) == int(f):
                length += 1
                continue
            else:
                f = strN[i]
                first = i
        if first==len(strN)-1 or length == len(strN)-1:
            return n            
        else:
            return int(strN[:first] + str(int(strN[first])-1)+'9'*(len(strN)-first-1))

在这里插入图片描述
思路:
one:
今天上午一直考虑的是如何循环,从最大值往下找数字,这样经过无数次的失败之后就一定会找到符合题目要求的数字,但是,在进行测试时发现,运行超出时长限制。

two:
然后开始探索第二种思路,我发现了一些规律,比如

11491537

这个测试用例的话,它就是在最大值处-1,然后结尾补9
然后我又登上了注定失败的路途

three:
我发现并不是所有的都是在最大值处-1,结尾补9,比如

418

它是在当第二位<第一位时就需要将第一位-1,结尾补9

four:
答案可想而之,还是有测试点无法通过,比如

99998

five:
最后我还是总结一下思路,利用了一个first指针,来识别截取的位置
首先,你会发现这道题的特点
它相邻两位的只有三种情况
一:前一位>后一位
二:前一位=后一位
三:前一位<后一位
真对这三种情况分别进行讨论:
一:前一位>后一位

  • 这说明此时已经不符合题目要求,再往后判断已经没有意义,所以需要记录前一位的下标,break

二:前一位=后一位

  • 这种情况的话还需要继续判断,比如

339967

  • 此时判断完33之后并不能代表着结束,所以需要continue跳过

三:前一位<后一位

  • 这种情况需要记录first的下标,因为它代表着当后面一旦出现不符合条件的值时可以从first下标进行-1操作,并在结尾补9

并且我发现有first还可以判断正序的数字,比如1234,因为当first==len(str(n))-1时,这时代表是正序,当然除了正序的情况还有另一种需要特殊考虑的,比如11,它需要用一个length来识别,当他等于数字的长度时,则代表他也属于可以直接输出结果的那种。

至此,这道题就完美收官!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

365JHWZGo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值