LeetCode | 670. 最大交换
-
难度 - 中等
-
描述:定一个非负整数,你至多可以交换一次数字中的任意两位。返回你能得到的最大值。
-
思路:找到列表中第一个跟大到小排列列表不一样的值,互换位置
-
难点:定位到交换两数中的后者(较大者)
-
定位方式1:按照num_list顺序定位,num_list.index(num_sort_list[i])得其下标。bug:当同时存在相同两个num_sort_list[i]时,此方法失效。
-
定位方式2:按照num_list逆序定位,num_list[::-1].index(num_sort_list[i])得其逆序的下标。列表长度-1,减去逆序下标,即得其下标。
-
'''
[9, 3, 6, 7]
[7, 6, 3, 9] #[::-1]
[9, 7, 6, 3] #sort
'''
class Solution:
def maximumSwap(self, num):
num_list = [int(i) for i in list(str(num))]
num_sort_list = sorted(num_list,reverse = True)
for i in range(len(num_list)):
if num_list[i] != num_sort_list[i]:
num_list[i], num_list[len(num_list)-num_list[::-1].index(num_sort_list[i])-1] = \
num_sort_list[i], num_list[i]
break
return int("".join([str(i) for i in num_list]))
print(Solution().maximumSwap(98368))