738. 单调递增的数字

在这里插入图片描述

分析

(自定义概念)

1.降点==从左往右第一个右边比它小的点

如 893 中的9
如 1234561 中的 6

2.最远相似点==一段数字完全相同序列的最左边的点

如22222的 第一个2为 该序列所有的2的最远相似点
如3333334 的 第一个3 该序列所有的3的最远相似点
如 11122223333 的第一个 1 该序列所有的1的最远相似点

(规律)

在存在降点的情况下,找到数字序列的降点的最远相似点,将该位自减1,同时该位后面全变成9

(举例,请试试这个规律)

2
不存在降点,返回2。
133
不存在降点,返回133。
10
1为降点,同时自身也为最远相似点,自减1,后面全变成9,09也即是9,返回9
1234
不存在降点。
332
第二个3为降点,第一个3为它的最远相似点,自减1,后面全变成9,返回299。
99993331111
第四个9为降点,第一个9为它的最远相似点,自减1,后面全变成9,返回89999999999。

代码(全注释)

# #

def monotoneIncreasingDigits(n):
    """
    :type n: int
    :rtype: int
    """
    #   n是int 数字
    st=str(n)  #st是数字的str
    stlen=len(st) #stlen是几位数字


    #利用p,q存储循环的上一个数字和正在循环的数字
    p=0
    q=0

    index=0#从0开始,表明 当前字符串的增点的上一位
    #假如是一位数字 则返回其本身
    if(stlen==1):
        return n
    #从前往后遍历字符串
    # 加上一个u,判断遍历到字符串的第几位
    u=0
    for c in st:
        #q为当前数字
        q=int(c)
        # 特殊情况,第一位时,只有q,没有p
        if(u==0):
            #  q传给p后,直接到下一位
            p=q
        #其余有三种情况 q>p q==p q<p
        elif(q>p):
            #说明还在递增,q传给p后,直接到下一位
            p=q
            index=u
        elif(q==p):
            # 说明还在递增,q传给p后,直接到下一位
            p = q
            #index不变
        else:
            #比它小说明要找断点了,设置一个 index,表明 当前字符串的增点的上一位
            """
            index
            遇到降点等于不更新
            遇到升点更新成该位

            """

            l1=st[0:index]
            l2=str(int(st[index])-1)
            l3='9'*(len(st)-len(l1)-len(l2))
            return int(l1+l2+l3)
        u+=1
    return n
if __name__=="__main__":
    print(monotoneIncreasingDigits(332))



在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值