我的思路:
数字只有一位 直接返回自身
数字有多位 要分情况讨论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/