mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Update 0738.单调递增的数字.md
This commit is contained in:
@ -164,17 +164,110 @@ class Solution {
|
||||
|
||||
|
||||
### Python:
|
||||
暴力
|
||||
```python
|
||||
class Solution:
|
||||
def monotoneIncreasingDigits(self, n: int) -> int:
|
||||
a = list(str(n))
|
||||
for i in range(len(a)-1,0,-1):
|
||||
if int(a[i]) < int(a[i-1]):
|
||||
a[i-1] = str(int(a[i-1]) - 1)
|
||||
a[i:] = '9' * (len(a) - i) #python不需要设置flag值,直接按长度给9就好了
|
||||
return int("".join(a))
|
||||
```
|
||||
def checkNum(self, num):
|
||||
max_digit = 10
|
||||
while num:
|
||||
digit = num % 10
|
||||
if max_digit >= digit:
|
||||
max_digit = digit
|
||||
else:
|
||||
return False
|
||||
num //= 10
|
||||
return True
|
||||
|
||||
def monotoneIncreasingDigits(self, N):
|
||||
for i in range(N, 0, -1):
|
||||
if self.checkNum(i):
|
||||
return i
|
||||
return 0
|
||||
|
||||
```
|
||||
贪心(版本一)
|
||||
```python
|
||||
class Solution:
|
||||
def monotoneIncreasingDigits(self, N: int) -> int:
|
||||
# 将整数转换为字符串
|
||||
strNum = str(N)
|
||||
# flag用来标记赋值9从哪里开始
|
||||
# 设置为字符串长度,为了防止第二个for循环在flag没有被赋值的情况下执行
|
||||
flag = len(strNum)
|
||||
|
||||
# 从右往左遍历字符串
|
||||
for i in range(len(strNum) - 1, 0, -1):
|
||||
# 如果当前字符比前一个字符小,说明需要修改前一个字符
|
||||
if strNum[i - 1] > strNum[i]:
|
||||
flag = i # 更新flag的值,记录需要修改的位置
|
||||
# 将前一个字符减1,以保证递增性质
|
||||
strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + strNum[i:]
|
||||
|
||||
# 将flag位置及之后的字符都修改为9,以保证最大的递增数字
|
||||
for i in range(flag, len(strNum)):
|
||||
strNum = strNum[:i] + '9' + strNum[i + 1:]
|
||||
|
||||
# 将最终的字符串转换回整数并返回
|
||||
return int(strNum)
|
||||
|
||||
```
|
||||
贪心(版本二)
|
||||
```python
|
||||
class Solution:
|
||||
def monotoneIncreasingDigits(self, N: int) -> int:
|
||||
# 将整数转换为字符串
|
||||
strNum = list(str(N))
|
||||
|
||||
# 从右往左遍历字符串
|
||||
for i in range(len(strNum) - 1, 0, -1):
|
||||
# 如果当前字符比前一个字符小,说明需要修改前一个字符
|
||||
if strNum[i - 1] > strNum[i]:
|
||||
strNum[i - 1] = str(int(strNum[i - 1]) - 1) # 将前一个字符减1
|
||||
# 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质
|
||||
for j in range(i, len(strNum)):
|
||||
strNum[j] = '9'
|
||||
|
||||
# 将列表转换为字符串,并将字符串转换为整数并返回
|
||||
return int(''.join(strNum))
|
||||
|
||||
|
||||
```
|
||||
贪心(版本三)
|
||||
|
||||
```python
|
||||
class Solution:
|
||||
def monotoneIncreasingDigits(self, N: int) -> int:
|
||||
# 将整数转换为字符串
|
||||
strNum = list(str(N))
|
||||
|
||||
# 从右往左遍历字符串
|
||||
for i in range(len(strNum) - 1, 0, -1):
|
||||
# 如果当前字符比前一个字符小,说明需要修改前一个字符
|
||||
if strNum[i - 1] > strNum[i]:
|
||||
strNum[i - 1] = str(int(strNum[i - 1]) - 1) # 将前一个字符减1
|
||||
# 将修改位置后面的字符都设置为9,因为修改前一个字符可能破坏了递增性质
|
||||
strNum[i:] = '9' * (len(strNum) - i)
|
||||
|
||||
# 将列表转换为字符串,并将字符串转换为整数并返回
|
||||
return int(''.join(strNum))
|
||||
|
||||
```
|
||||
贪心(版本四)精简
|
||||
|
||||
```python
|
||||
class Solution:
|
||||
def monotoneIncreasingDigits(self, N: int) -> int:
|
||||
strNum = str(N)
|
||||
for i in range(len(strNum) - 1, 0, -1):
|
||||
# 如果当前字符比前一个字符小,说明需要修改前一个字符
|
||||
if strNum[i - 1] > strNum[i]:
|
||||
# 将前一个字符减1,以保证递增性质
|
||||
# 使用字符串切片操作将修改后的前面部分与后面部分进行拼接
|
||||
strNum = strNum[:i - 1] + str(int(strNum[i - 1]) - 1) + '9' * (len(strNum) - i)
|
||||
return int(strNum)
|
||||
|
||||
|
||||
```
|
||||
### Go
|
||||
```go
|
||||
func monotoneIncreasingDigits(N int) int {
|
||||
|
Reference in New Issue
Block a user