給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)
由於該數的組成是單調遞增的,所以,但我們檢索到乙個不單調的數字組合的時候,說明最高位一定比下一位要大。這個處理起來很簡單,我們只需要將最高位減1,其他剩下的數字全變成9,這樣就找到了我們想要的數。
class
solution
: @classmethod
defmonotoneincreasingdigits
(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上的乙個大佬的。
leetcode 738 單調遞增的數字
描述 給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10 輸出 9 示例 2 輸入 n 1234 輸出 1234 示例 3 輸入 n...
leetCode 738 單調遞增的數字
給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10輸出 9示例 2 輸入 n 1234 輸出 1234示例 3 輸入 n 332輸出...
LeetCode 738 單調遞增的數字
給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。當且僅當每個相鄰位數上的數字 x 和 y 滿足 x y 時,我們稱這個整數是單調遞增的。示例 1 輸入 n 10 輸出 9 示例 2 輸入 n 1234 輸出 1234 示例 3 輸入 n 33...