题目描述:
当且仅当每个相邻位数上的数字 x
和 y
满足 x <= y
时,我们称这个整数是单调递增的。
给定一个整数 n
,返回 小于或等于 n
的最大数字,且数字呈 单调递增 。
示例 1:
输入: n = 10 输出: 9
示例 2:
输入: n = 1234 输出: 1234
示例 3:
输入: n = 332 输出: 299
提示:
0 <= n <= 109
我的作答:
写代码好烦鹅鹅鹅鹅鹅鹅好烦啊啊啊啊啊,写两三道题就开始头晕。。
根据贪心攻略,这道题是如果给的输入整数恰好是单调递增(或者相等)的话,那只要输出这个数字就行,即不用任何处理;但是如果不是单调递增(也就是数位上前一位比后一位大),就需要对前一位数位-1,且根据贪心,后一位数位变成9;
从这个思路出发,我们只要一步步迭代和遍历就行;
class Solution(object):
def monotoneIncreasingDigits(self, n):
"""
:type n: int
:rtype: int
"""
n = [int(char) for char in str(n)]
flag = len(n)
for i in range(len(n)-1, 0, -1):
if n[i-1]>n[i]:
n[i-1]-=1 #前一位-1
flag = i #更新索引,保存最后一个的“后一位”
for i in range(flag, len(n)):
n[i] = 9 #把所有的“后一位”都变成9
return int(''.join(str(i) for i in n))
参考:
class Solution(object):
def monotoneIncreasingDigits(self, n):
"""
:type n: int
:rtype: 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)