1. 問題描述:
給定乙個非負整數 n,找出小於或等於 n 的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。
(當且僅當每個相鄰位數上的數字 x 和 y 滿足 x <= y 時,我們稱這個整數是單調遞增的。)
示例 1:
輸入: n = 10
輸出: 9
示例 2:
輸入: n = 1234
輸出: 1234
示例 3:
輸入: n = 332
輸出: 299
說明:n
是在[0, 10^9]
範圍內的乙個整數。
2. 思路分析:
① 首先想到的是從n這個數字往前找,依次檢查n之前的數字是否滿足單調遞增的條件,假如滿足那麼返回這個數字即可,但是提交上去後面比較大的數字超時了
② 第二個比較容易想到的是找出數字後面開始逆序的位置,這個時候需要將前面的數字減去1,看一下是否滿足條件,比如1276,逆序的位置為3,所以將前面的7這個數字減去1得到6而這個時候減去1之後是滿足單調遞增所以這個方法大體上是可行的,但是也會遇到這樣的情況,比如數字12333332,這個時候我們只是減去了乙個1的話那麼結果就是錯誤的,因為有可能前面的數字減去1之後導致不是單調遞增了,所以這個時候需要使用迴圈繼續比較當前位置的數字與前面乙個數字的大小關係,依次減去1直到所有的位置都是單調遞增的,最後根據記錄的逆序的位置index計算出結果,[0:index]這些位置的數字是順序的,直接計算出結果即可,後面[index:len(nums)]的位置都是9,將兩部分的結果結合起來就是要求解的答案了
3. **如下:
class solution:
def solve(self, n: int):
nums = list()
while n > 0:
# 使用insert函式往列表開始位置新增元素
nums.insert(0, n % 10)
n //= 10
return nums
def monotoneincreasingdigits(self, n):
nums = self.solve(n)
# 逆序遍歷
index = len(nums)
for i in range(len(nums) - 1, 0, -1):
if nums[i] < nums[i - 1]:
nums[i - 1] -= 1
index = i
res = 0
for i in range(0, index):
res = res * 10 + nums[i]
for i in range(index, len(nums)):
res = res * 10 + 9
return res
超時**:
class solution:
def solve(self, num):
# 使用迴圈從後往前判斷每一位數字的大小情況
pre = 10 ** 9
while num > 0:
if num % 10 > pre: return false
pre = num % 10
# 每一次都除以10這樣可以取出每一位上的數字是多少
num //= 10
return true
def monotoneincreasingdigits(self, n: int) -> int:
# 其實這道題目可以使用從n往前找判斷每一位數字是否遞增的即可, 主要是模擬整個過程
while n >= 0:
if self.solve(n): return n
n -= 1
return -1
738 單調遞增的數字
738.單調遞增的數字 給定乙個非負整數n,找出小於或等於n的最大的整數,同時這個整數需要滿足其各個位數上的數字是單調遞增。示例 1 輸入 n 10 輸出 9 示例 2 輸入 n 1234 輸出 1234 示例 3 輸入 n 332 輸出 299 說明 n 是在 0,10 9 範圍內的乙個整數。基本...
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輸出...