Leetcode 單調遞增的數字

2021-10-12 05:02:45 字數 1589 閱讀 9410

給定乙個非負整數 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...