670. 最大交换

136 阅读3分钟

给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。

示例 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