题目描述
给定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
示例 1 :
输入: 2736
输出: 7236
解释: 交换数字2和数字7。
示例 2 :
输入: 9973
输出: 9973
解释: 不需要交换。
注意:
给定数字的范围是 [0, 108]
解题思路
该问题是要求至多一次交换,使交换后的数成为经过一次变换所能得到的最大交换数,则对于已经是最大数的数字,可以不进行交换。这里采用的思路是将原数字拆分存储到整形列表中,从最大位开始依次寻找第一个不为9的数字mm,再从最小位依次寻找至mm以后的第一个为9或最大的数字nn,将俩数字进行交换,若无则不交换,最后将列表数重新转换为一个整型数,进行输出。
源代码
class Solution:
def maximumSwap(self, num: int) -> int:
t=str(num)
n=len(t)-1
n1=len(t)
s=list(range(n1))
max1=0
mm=nn=-1
while num>0:
s[n]=num%10
num=num//10
n=n-1
for i in range(n1):
for j in range(n1-i):
if max1==0:
if s[i]!=9:
max1=s[i]
mm=i
else:
break
if mm!=-1 and nn==-1:
max1=s[i]
mm=i
if s[n1-1-j]>max1:
max1=s[n1-1-j]
nn=n1-1-j
if mm!=-1 and nn!=-1:
s[mm],s[nn]=s[nn],s[mm]
break
for i in range(n1):
num=num*10+s[i]
return num
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-swap
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。