描述
给定一个非负整数,你可以交换两个数位至多一次来获得最大的合法的数。返回最大的合法的你能够获得的数。
思路
1.读取数值,将数值转换成字符串
2.从后至前寻找最大数字。先设置一个的指针point指向最后一位,for循环中如果前面的数值比指针指向的大就将指针指向最大的数字的下标。
3.如果最大数值不是数值的第一位数字,就调换最大值与第一位数字的位置,返回新的数值;如果最大数值是第一位,则截取除最高位数字剩下的数字组成新的数值反复进行1-3步。
class Solution:
"""
@param num: a non-negative intege
@return: the maximum valued number
"""
def maximumSwap(self, num):
# Write your code here
snum = str(num)
numLength = len(snum)
if numLength == 1: #递归的边界
return num
point = numLength - 1
maxNum = snum[numLength - 1]
# 找出最大的数的位置
for i in range(numLength - 2,-1,-1):
if snum[i] > maxNum:
maxNum = snum[i]
point = i
# 如果最大的数不在第一位,则与第一位交换
if point != 0:
snum = list(snum)
temp = snum[0]
snum[0] = snum[point]
snum[point] = temp
snum = ''.join(snum)
return int(snum)
# 如果最大的数字在第一位,则递归除了第一位的数值
elif point == 0:
num = int(str(num)[0]) * (10 **(numLength-1)) + Solution().maximumSwap(num%(10 ** (numLength-1)))
return num