【代码随想录】刷题记录(96)-单调递增的数字

发布于:2025-02-10 ⋅ 阅读:(42) ⋅ 点赞:(0)

题目描述:

当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。

给定一个整数 n ,返回 小于或等于 n 的最大数字,且数字呈 单调递增 。

 

示例 1:

输入: n = 10
输出: 9

示例 2:

输入: n = 1234
输出: 1234

示例 3:

输入: n = 332
输出: 299

 

提示:

  • 0 <= n <= 109

 

我的作答:

写代码好烦鹅鹅鹅鹅鹅鹅好烦啊啊啊啊啊,写两三道题就开始头晕。。

根据贪心攻略,这道题是如果给的输入整数恰好是单调递增(或者相等)的话,那只要输出这个数字就行,即不用任何处理;但是如果不是单调递增(也就是数位上前一位比后一位大),就需要对前一位数位-1,且根据贪心,后一位数位变成9;

从这个思路出发,我们只要一步步迭代和遍历就行;

class Solution(object):
    def monotoneIncreasingDigits(self, n):
        """
        :type n: int
        :rtype: int
        """
        n = [int(char) for char in str(n)]
        flag = len(n)
        for i in range(len(n)-1, 0, -1):
            if n[i-1]>n[i]:
                n[i-1]-=1 #前一位-1
                flag = i #更新索引,保存最后一个的“后一位”
        for i in range(flag, len(n)):
            n[i] = 9 #把所有的“后一位”都变成9
        return int(''.join(str(i) for i in n))

7d30eca21ef1491bbae65ba0af763e8c.png

 

参考:

class Solution(object):
    def monotoneIncreasingDigits(self, n):
        """
        :type n: int
        :rtype: int
        """
        # 将整数转换为字符串
        strNum = str(n)
        # flag用来标记赋值9从哪里开始
        # 设置为字符串长度,为了防止第二个for循环在flag没有被赋值的情况下执行
        flag = len(strNum)
        
        # 从右往左遍历字符串
        for i in range(len(strNum) - 1, 0, -1):
            # 如果当前字符比前一个字符小,说明需要修改前一个字符
            if strNum[i - 1] > strNum[i]:
                flag = i  # 更新flag的值,记录需要修改的位置
                # 将前一个字符减1,以保证递增性质
                strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + strNum[i:]
        
        # 将flag位置及之后的字符都修改为9,以保证最大的递增数字
        for i in range(flag, len(strNum)):
            strNum = strNum[:i] + '9' + strNum[i + 1:]
        
        # 将最终的字符串转换回整数并返回
        return int(strNum)

65cd00e97376495f8b134faa8c9c6c1c.png