方法一:暴力破解
# -*- coding:utf-8 -*- class Solution: def PrintMinNumber(self, numbers): # write code here if not numbers: return "" from itertools import permutations b = permutations(numbers) result = [] for i in b: c = '' for j in i: c += str(j) result.append(int(c)) return min(result)
但是我缕了一下,如果面试的时候面试官让我不要暴力咋整,毕竟暴力是最LOW的,时间复杂度也是O(n!)
方法二: 冒泡排序
虽然是冒泡排序,但是比较大小的两个数确实 a_b = a+b b_a = b+a ,毕竟我们待会要把数组中所有元素拼接起来,所以要比较的当然是拼接的值。
如果a_b > b_a 的话,则交换 a,b = b,a
经过n轮冒泡后,我们可以把与其他元素拼接 a_b 都会大于b_a 的元素移到最后,把与其他元素拼接 a_b 都会小于b_a 的元素移到最前,这就符合我们的要求,排成一个最小的数,那肯定与其他元素拼接最小的元素在第一个,最大的在最后了,这样就可以确保我们待会把排序完的数组串起来可以得到一个最小值
# -*- coding:utf-8 -*- class Solution: def PrintMinNumber(self, numbers): # write code here lg = len(numbers) for i in range(1,lg+1): for j in range(lg-i): a_b = int(str(numbers[j])+str(numbers[j+1])) b_a = int(str(numbers[j+1])+str(numbers[j])) if a_b > b_a: numbers[j],numbers[j+1] = numbers[j+1],numbers[j] return ''.join([str(i) for i in numbers])