LeetCode 738. 单调递增的数字

题目

思路

 这道题目要找到符合条件且小于或等于N 的最大整数,最先想到的思路是贪心。按照题意,如果原本的数字就是递增排列的,则返回原数即可。如果有递减的情况存在,则从左到右找到第一个出现递减的地方,将该位减1,后面的位数均变成9,这样就能保证既小于原数,又能取到最大值。但是要注意一种特殊情况,例如‘332’,这种情况如果直接在第一个2处让2减1的话,则更改后的数字不符合递增的条件。这种情况是在有连续的位相等的情况下出现,因此在找到第一个出现递减的地方后,应该向前遍历,直到找到不相等的地方,将这个地方作为新的更改点减1,后面每一位依然变成9。

代码

class Solution:
    def monotoneIncreasingDigits(self, N: int) -> int:
        tempstr=list(str(N))
        n=len(tempstr)
        if n==1:
            return N
        cur=-1
        for i in range(1,n):
            if ord(tempstr[i])<ord(tempstr[i-1]):
                cur=i-1
                while cur and tempstr[cur]==tempstr[cur-1]:
                    cur-=1
                break
        if cur==-1:
            return N
        #print(cur)
        tempstr[cur]=chr(ord(tempstr[cur])-1)
        for i in range(cur+1,n):
            tempstr[i]='9'
        return int(''.join(tempstr))

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值