738.单调递增的数字
生活随笔
收集整理的這篇文章主要介紹了
738.单调递增的数字
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
'''
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 = 0length = 0for i in range(1, len(strN)):if int(strN[i]) < int(f): breakelif int(strN[i]) == int(f):length += 1continueelse:f = strN[i]first = iif 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來識別,當他等于數字的長度時,則代表他也屬于可以直接輸出結果的那種。
至此,這道題就完美收官!
總結
以上是生活随笔為你收集整理的738.单调递增的数字的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Lintcode 738.Count D
- 下一篇: 频谱分析仪分辨率带宽到底是什么?