LeetCode 738.单调递增的数字

我的思路:


数字只有一位 直接返回自身
数字有多位 要分情况讨论

case1:3089
       3089小于3333 所以返回2000+最大的三位数 也就是2000+999=2999
case2:2315
       2315大于2222 所以返回2000+315中最大的满足条件的数字
       315小于333 所以最大的满足条件的数字是299
       因此返回2000+299=2299

我的代码:

def monotoneIncreasingDigits(self, N):
        # 定义一个函数来判断数字是否满足题意
        def judge(x):
            strx=str(x)
            for i in range(len(strx)-1):
                if strx[i]>strx[i+1]:
                    return False
            return True

        def hanshu(x):
            length=len(str(x))
            if length<2 :
                return x
            else:
                # 如果本身满足条件 直接返回本身
                if judge(x):
                    return x
                # 如果本身不满足条件 返回第一位的数字减去1 后面全是9
                else: 
                    # first用来记录数字的最高位
                    # border用来表示1111 222这种判断边界
                    # a用来记录数字的最高位代表的真正意义 例如在2345中2代表的是2000
                    first = x // 10**(length-1)
                    border=first
                    for i in range(length-1):
                        border=border*10+first
                    a = first * (10 ** (length - 1))
                    # 如果数字大于边界 接着寻找后面位数的最大值
                    # 否则返回第一位的数字减去1 后面全是9
                    if x>=border:
                        return a + hanshu(x-a)
                    else:
                        # tail用来算出后面的9
                        tail = 9
                        for i in range(length - 2):
                            tail = tail*10 + 9
                        return (first - 1) * (10 ** (length - 1))+tail
        return hanshu(N)

优秀题解:

代码:

class Solution:
    def monotoneIncreasingDigits(self, N: int) -> int:
        ones = 111111111
        result = 0
        for _ in range(9):
            while result + ones > N:
                ones //= 10
            result += ones
        return result

妙啊~

优秀题解来源:https://leetcode-cn.com/problems/monotone-increasing-digits/solution/1111lei-jia-fa-by-wincss-zt83/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值