题目
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。
思路
1. 排列组合(回溯算法)
2. 数字排序
代码
很遗憾,回溯思想的排列组合算法超时了,看来是我想的太多了
import copy
class Solution:
min_number_array = []
def PrintMinNumber(self, numbers):
final_result = []
if len(numbers) is 1:
return numbers[0]
else:
self.permutation(numbers, [])
for item in self.min_number_array:
tmp = []
for i in item:
tmp.append(str(numbers[i]))
final_result.append(''.join(tmp))
return str(min(final_result))
def permutation(self, numbers, num_array):
num_copy = copy.deepcopy(num_array)
if len(num_copy) == len(numbers):
self.min_number_array.append(num_copy)
return
for i in range(len(numbers)):
if not num_copy.__contains__(i):
num_copy.append(i)
self.permutation(numbers, num_copy)
num_copy.pop()
return
那么就只能用数字比大小排序了
import functools
class Solution:
def PrintMinNumber(self, numbers):
def sort_rule(x, y):
a, b = x + y, y + x
if a > b:
return 1
elif a < b:
return -1
else:
return 0
strs = [str(num) for num in numbers]
strs.sort(key=functools.cmp_to_key(sort_rule))
return ''.join(strs)