670. 最大交换
一、问题描述
二、列表知识
1、 列表反转
(1)用list1 = list1[::-1]反转
list1 = [9,8,9,5,5,6]
print(list1)
list1 = list1[::-1]
print(list1)
(2)利用reverse()方法
list1 = [9,8,9,5,5,6]
print(list1)
list1.reverse()
print(list1)
三、算法思想
1、将传进来的数利用先对10取余,再对10整除的方法拆开,存放到列表里面便于处理。
2、对列表反转,使得其和num相同位置上的数一样。
3、定义变量k,用来记录第i个后面比第i个元素大的元素的位置,初值为0;定义变量tem,用来记录第i个后面比第i个元素大的元素的值,初值为0。
4、用两个for循环来找要交换的元素。第一个从头到尾遍历,第二个查找i,后面比list2[i]和tem大的元素和其下标。
5、从第二个for循环出来时判断k的值,k大于0说明找到了交换的位置,跳出循环。
6、将list2转换成字符串类型,然后再转换成int类型输出。
四、代码
class Solution(object):
def maximumSwap(self, num):
"""
:type num: int
:rtype: int
"""
list1 = []
while num != 0:
list1.append(num % 10 )
num = num // 10
list1.reverse()
list2= list1[:]
length = len(list1)
k = 0
tem =0
for i in range(length-1):
for j in range(i+1,length):
if list2[j] > list2[i] and list2[j] >= tem:
# 加上list2[j] >= tem是为了保证tem是最大的,等号是为了确保交换后的数最大
# 例:91848,只要相等就让k往后走,结果为98841;若不加等号,结果为98148
tem = list2[j]
k = j
if k > 0:
list2[k] = list2[i]
list2[i] = tem
break
str1 = ''
for i in range(length):
str1 = str1 + str(list2[i])
return int(str1)