zoukankan      html  css  js  c++  java
  • 0738单调递增的数字 Marathon

    给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

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

    示例 1:

    输入: N = 10
    输出: 9
    示例 2:

    输入: N = 1234
    输出: 1234
    示例 3:

    输入: N = 332
    输出: 299
    说明: N 是在 [0, 10^9] 范围内的一个整数。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/monotone-increasing-digits

    参考:

    python

    # 0738.单调递增的数字
    
    class Solution:
        def monotoneIncreasingDigits(self, n: int) -> int:
            """
            朴素求解,暴力解法,通过取模依次取到低位数字,高位数字应该小于等于低位数字
            :param N:
            :return:
            """
            def checkNum(num: int) -> bool:
                """判断单调递增的数字,高位小于等于低位数字"""
                max = 10
                while num :
                    t = num % 10
                    if max >= t:
                        max = t
                    else:
                        return False
                    num = num // 10
                return True
    
            for i in range(n, 0, -1):
                if checkNum(i):
                    return i
            return 0
    
    class Solution1:
        def monotoneIncreasingDigits(self, n: int) -> int:
            """
            由后向前遍历,后面的可以用上,如98,由于9大于8,9-1变8,同时个位8变9,此时就是最大的递增数字
            或者如332,由于十位3大于个位2,十位变2,个位变9,同理百位变2,十位2变9,最后就是299
            :param n:
            :return:
            """
            num_list = list(str(n))
            for i in range(len(num_list)-1, 0, -1):
                if int(num_list[i]) < int(num_list[i-1]):
                    num_list[i-1] = str(int(num_list[i-1])-1)
                    num_list[i:] = "9" * (len(num_list)-i)
            return int("".join(num_list))
    
    
    if __name__ == "__main__":
        test = Solution()
        print(test.monotoneIncreasingDigits(332))
    
    
    

    golang

    package greedy
    
    import (
    	"strconv"
    )
    
    
    // 贪心算法
    func monotoneIncreasingDigits(n int) int {
    	stringNum := strconv.Itoa(n)
    	// bytes类型的值为对应ascii的对应数
    	strNumArr := []byte(stringNum) // go中string不可变类型,转为数组方便更改
    	length := len(strNumArr)
    	if length <= 1 {
    		return n
    	}
    	for i:=length-1;i>0;i-- {
    		if strNumArr[i-1] > strNumArr[i] {
    			strNumArr[i-1] -= 1
    			for j:=i;j<length;j++ { // 后面的数置为9
    				strNumArr[j] = '9'
    			}
    		}
    	}
    	res,_ := strconv.Atoi(string(strNumArr))
    	return res
    }
    
    
    
  • 相关阅读:
    P3158 [CQOI2011]放棋子
    Codeforces 1220D. Alex and Julian
    Codeforces 1220C. Substring Game in the Lesson
    Codeforces 1220B. Multiplication Table
    BZOJ 3260. 跳
    BZOJ 3251. 树上三角形
    P1398 [NOI2013]书法家
    P1224 [NOI2013]向量内积
    The Preliminary Contest for ICPC Asia Shanghai 2019 A. Lightning Routing I
    P4271 [USACO18FEB]New Barns
  • 原文地址:https://www.cnblogs.com/davis12/p/15600779.html
Copyright © 2011-2022 走看看