题目
思路
这道题目要找到符合条件且小于或等于N 的最大整数,最先想到的思路是贪心。按照题意,如果原本的数字就是递增排列的,则返回原数即可。如果有递减的情况存在,则从左到右找到第一个出现递减的地方,将该位减1,后面的位数均变成9,这样就能保证既小于原数,又能取到最大值。但是要注意一种特殊情况,例如‘332’,这种情况如果直接在第一个2处让2减1的话,则更改后的数字不符合递增的条件。这种情况是在有连续的位相等的情况下出现,因此在找到第一个出现递减的地方后,应该向前遍历,直到找到不相等的地方,将这个地方作为新的更改点减1,后面每一位依然变成9。
代码
class Solution:
def monotoneIncreasingDigits(self, N: int) -> int:
tempstr=list(str(N))
n=len(tempstr)
if n==1:
return N
cur=-1
for i in range(1,n):
if ord(tempstr[i])<ord(tempstr[i-1]):
cur=i-1
while cur and tempstr[cur]==tempstr[cur-1]:
cur-=1
break
if cur==-1:
return N
#print(cur)
tempstr[cur]=chr(ord(tempstr[cur])-1)
for i in range(cur+1,n):
tempstr[i]='9'
return int(''.join(tempstr))