给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
给定数字的范围是 [0, 10^8]
题目链接leetcode-cn.com/problems/ma…
题目分析
这次就不用分析了吧,题目说的很清楚,就是只调换一个数,让这个数变得最大
考虑做法
目前想到的就只有两种方法
一、
因为最大就是个10^8
的9位数,所以不考虑他,就只有8位数可以考虑
因为每次只能调换一个那么8位数的时候最多也就只有28种,for循环遍历一下,然后加到列表里,sort排序一下,取最后一个。我们硬写一个暴力解法也不会超出内存。但是今天有点想偷懒,就不写了。
二、
我们可以先想一个问题,就是这个数把数字重新组合最大的数是多少。
举个例子:
假设这个数是2736
重新组合最大的数就是7236
我们用2736和7236从最大一位开始对比
第一位是2和7,那么我们就知道对于第,一个数把7放到第一位就是最大
再举个例子987789
重新组合最大的数是998877
第一位是9和9,第二位是8和9,我们就可以把9放到第2位就获得了最大的数,当然我们不能用最前面的9,要从最后面找最小的9换到第二位才行
那么代码要怎么实现呢
解法一
这个方法不想写,厉害的兄弟姐妹们可以试试
解法二
class Solution(object):
def maximumSwap(self, num):
"""
:type num: int
:rtype: int
"""
a = 0
b = ''
numList = list(str(num))# 首先为了方便操作,把这个数转成字符串,再拆成列表
copyList = [] # 为了不操作到原有的列表,创建一个深拷贝列表
for i in numList:
copyList.append(i)
copyList.sort() # 拷贝后,对拷贝的列表排序,获得一个最小的数
copyList = copyList[::-1] # 最小的数倒序,就是最大的数
if copyList==numList: # 如果这个就是最大的,就不用操作了
return num
for i in range(len(numList)):
if numList[i] != copyList[i]: # 开始从高位往低位对比,看第几位开始不一样
b = numList[i]
numList[i] = copyList[i] # 把高位的数换成大,需要放到低位的数用个变量先存一下
numList = numList[::-1]
for aa in range(len(numList)): # 把数组倒序一下,从低位开始找最低位的需要交换到高位的数
if numList[aa] == copyList[i]:
numList[aa]=b
for i in range(len(numList)): # 把列表重新生成新的数提交
a = a + int(numList[i])*10**i
return a