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

思路:先将数组中每个元素转换成String类型,然后进行排序,如果str(a) + str(b) > str(b) + str(a),说明ab > ba,应该把b排在a前面。使用冒泡排序编写程序如下:

def PrintMinNumber(self, numbers):
    # write code here
    n = len(numbers)
    for i in range(n):
        for j in range(i+1, n):
            if int(str(numbers[i]) + str(numbers[j]) > str(numbers[j]) + str(numbers[i])):
                numbers[j], numbers[i] = numbers[i], numbers[j]
    return ''.join([str(i) for i in numbers])

使用sorted函数和匿名函数进行排序代码如下:

def PrintMinNumber(self, numbers):
    # write code here
    lmb = lambda n1, n2: int(str(n1) + str(n2)) - int(str(n2) + str(n1))
    a = sorted(numbers, cmp=lmb)
    return ''.join([str(i) for i in a])

list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
cmp和key的用法举例:
L=[('b',2),('a',1),('c',3),('d',4)]
sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函数
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]