Leetcode 單調遞增的數字
阿新 • • 發佈:2020-12-17
技術標籤:演算法
Leetecode 單調遞增的數字
題目
給定一個非負整數 N,找出小於或等於 N 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)
思路
由於該數的組成是單調遞增的,所以,但我們檢索到一個不單調的數字組合的時候,說明最高位一定比下一位要大。這個處理起來很簡單,我們只需要將最高位減1,其他剩下的數字全變成9,這樣就找到了我們想要的數。
程式碼
class Solution:
@classmethod
def monotoneIncreasingDigits (self, N: int) -> int:
nums = list(str(N)) # 轉換成字串
length = len(nums) # 獲取字串長度
begin = 0
# N 是否符合條件
is_result = True
max_num = float('-inf') # 負無窮
# 從前往後觀察
for i in range(1, length):
num = int(nums[i]) # 裝換成整型
pre_num = int(nums[i - 1])
# 記錄最大值
if pre_num > max_num:
begin = i - 1
max_num = pre_num
if pre_num > num:
is_result = False
break
# 如果 N 本身符合條件,直接返回 N
if is_result:
return N
# begin 位置減去 1,後面全部替換為 9
nums[begin] = str(int(nums[begin]) - 1)
for i in range(begin + 1, length):
nums[i] = '9'
return int("".join(nums))
其中,begin是用來記錄前一個數字的位置,如果該數字與下一個數字不構成遞減的關係的話,我們就直接將該數字減1,後面的全部替換成9,實現遞增的情況。
我們維持一個最大值,這個最大值其實就是前面的數的最大值,這個最大值其實只是用來記錄前一個數字的位置資訊的輔助標準,只有後面的數比這個最大值要大,那才是符合遞增的標準,不然就不符合。
當不符合標準的時候,由於我們已經記錄下來了不符合標準的數字的位置資訊。
所以只需要將該位置上的數字的值減1,同時後面所有的數字全賦值成9,那麼,我們的答案就出來了。
PS:程式碼是leetcode上的一個大佬的。