给定非负整数N,找到小于或等于N单调递增数字的最大数字。
(单调递增的数字即每对相邻的数字x和y满足x <= y。)
Example 1:
Input: N = 10
Output: 9
Example 2:
Input: N = 1234
Output: 1234
Example 3:
Input: N = 332
Output: 299
Note: N is an integer in the range [0, 10^9].
题解:
本题最终目的是获得一个非递减的数字,因此需要着重考虑相邻数字之间的关系,分别有三种情况
-
.ls[i] <ls[i+1] :continue
-
ls[i] ==ls[i+1]: continue
-
ls[i]>ls[i+1]:
该种情况下需要获取ls[i:]的非递减最大数字,除了i位以外最大数字应该为int(“9”*len(ls[i+1:]),而i位上面的数字减去1.
如果ls[i-1]==ls[i],这样就造成了ls[i-1]>ls[i],比如数字’3331‘,最大非递减数应为2999,因此我们需要返回去判断,这里最好的思路是采用指针,指针的位置即为要减1的位置,之后的数值全为9。完整代码如下:
class Solution:
def monotoneIncreasingDigits(self, N: int) -> int:
s = [int(i) for i in str(N)]
for i in range(len(s) - 1):
if s[i] > s[i + 1]:
j = i
while j > 0 and s[j - 1] == s[j]:
j -= 1
s[j] -= 1
return int("".join(map(str, s[:j + 1])) + (len(s[ j+1:]) * "9"))
return N