leetcode738. Monotone Increasing Digits (单调非递减数)python

给定非负整数N,找到小于或等于N单调递增数字的最大数字。

(单调递增的数字即每对相邻的数字x和y满足x <= y。)
Example 1:

Input: N = 10
Output: 9

Example 2:

Input: N = 1234
Output: 1234

Example 3:

Input: N = 332
Output: 299

Note: N is an integer in the range [0, 10^9].

题解
本题最终目的是获得一个非递减的数字,因此需要着重考虑相邻数字之间的关系,分别有三种情况

  • .ls[i] <ls[i+1] :continue

  • ls[i] ==ls[i+1]: continue

  • ls[i]>ls[i+1]:
    该种情况下需要获取ls[i:]的非递减最大数字,除了i位以外最大数字应该为int(“9”*len(ls[i+1:]),而i位上面的数字减去1.
    如果ls[i-1]==ls[i],这样就造成了ls[i-1]>ls[i],比如数字’3331‘,最大非递减数应为2999,因此我们需要返回去判断,这里最好的思路是采用指针,指针的位置即为要减1的位置,之后的数值全为9。

    完整代码如下

class Solution:
	def monotoneIncreasingDigits(self, N: int) -> int:
	    s = [int(i) for i in str(N)]
	    for i in range(len(s) - 1):
	        if s[i] > s[i + 1]:
	            j = i
	            while j > 0 and s[j - 1] == s[j]:
	                j -= 1
	            s[j] -= 1
	            return int("".join(map(str, s[:j + 1])) + (len(s[ j+1:]) * "9"))
	    return N
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值