剑指32-把数组排成最小的数

题目描述

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。


设num1和num2分别是两个数,定义符号_为连接两个数成一个数,如2_3表示连接2和3生成23这个数。有:

  • 如果num1_num2<num2_num1,则num1、num2和其它任意个数连接生成的最小的数字里,必定num1在num2之前。
  • 即,由num1和num2自身,就可以决定其在拼接的前后顺序关系。
  • 如果知道任意两个数的顺序关系,则包含所有数的全局的拼接方案就固定了。
1
2
3
4
5
6
7
8
class Solution:
def PrintMinNumber(self, numbers):
# 据测试结果发现,要求返回值是字符串
if len(numbers) == 0:
return ''
numbers = [str(i) for i in numbers]
numbers.sort(cmp = lambda x, y: int(x+y)-int(y+x))
return ''.join(numbers)