mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Update 0738.单调递增的数字.md
This commit is contained in:
@ -164,17 +164,110 @@ class Solution {
|
|||||||
|
|
||||||
|
|
||||||
### Python:
|
### Python:
|
||||||
|
暴力
|
||||||
```python
|
```python
|
||||||
class Solution:
|
class Solution:
|
||||||
def monotoneIncreasingDigits(self, n: int) -> int:
|
def checkNum(self, num):
|
||||||
a = list(str(n))
|
max_digit = 10
|
||||||
for i in range(len(a)-1,0,-1):
|
while num:
|
||||||
if int(a[i]) < int(a[i-1]):
|
digit = num % 10
|
||||||
a[i-1] = str(int(a[i-1]) - 1)
|
if max_digit >= digit:
|
||||||
a[i:] = '9' * (len(a) - i) #python不需要设置flag值,直接按长度给9就好了
|
max_digit = digit
|
||||||
return int("".join(a))
|
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
|
||||||
```go
|
```go
|
||||||
func monotoneIncreasingDigits(N int) int {
|
func monotoneIncreasingDigits(N int) int {
|
||||||
|
Reference in New Issue
Block a user