'''
Description: 738.单调递增的数字
Autor: 365JHWZGo
Date: 2021-11-10 09:34:56
LastEditors: 365JHWZGo
LastEditTime: 2021-11-10 14:55:40
'''
class Solution(object):
def monotoneIncreasingDigits(self, n):
"""
:type n: int
:rtype: int
"""
strN = str(n)
f = strN[0]
first = 0
length = 0
for i in range(1, len(strN)):
if int(strN[i]) < int(f):
break
elif int(strN[i]) == int(f):
length += 1
continue
else:
f = strN[i]
first = i
if first==len(strN)-1 or length == len(strN)-1:
return n
else:
return int(strN[:first] + str(int(strN[first])-1)+'9'*(len(strN)-first-1))
思路:
one:
今天上午一直考虑的是如何循环,从最大值往下找数字,这样经过无数次的失败之后就一定会找到符合题目要求的数字,但是,在进行测试时发现,运行超出时长限制。
two:
然后开始探索第二种思路,我发现了一些规律,比如
11491537
这个测试用例的话,它就是在最大值处-1,然后结尾补9
然后我又登上了注定失败的路途
three:
我发现并不是所有的都是在最大值处-1,结尾补9,比如
418
它是在当第二位<第一位时就需要将第一位-1,结尾补9
four:
答案可想而之,还是有测试点无法通过,比如
99998
five:
最后我还是总结一下思路,利用了一个first指针,来识别截取的位置
首先,你会发现这道题的特点
它相邻两位的只有三种情况
一:前一位>后一位
二:前一位=后一位
三:前一位<后一位
真对这三种情况分别进行讨论:
一:前一位>后一位
- 这说明此时已经不符合题目要求,再往后判断已经没有意义,所以需要记录前一位的下标,break
二:前一位=后一位
- 这种情况的话还需要继续判断,比如
339967
- 此时判断完33之后并不能代表着结束,所以需要continue跳过
三:前一位<后一位
- 这种情况需要记录first的下标,因为它代表着当后面一旦出现不符合条件的值时可以从first下标进行-1操作,并在结尾补9
并且我发现有first还可以判断正序的数字,比如1234,因为当first==len(str(n))-1时,这时代表是正序,当然除了正序的情况还有另一种需要特殊考虑的,比如11,它需要用一个length来识别,当他等于数字的长度时,则代表他也属于可以直接输出结果的那种。
至此,这道题就完美收官!