JZ45 把数组排成最小的数
描述
输入一个正整数数组numbers,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
例如输入数组[3,32,321],则打印出这三个数字能排成的最小数字为321323。
数据范围:
0<=len(numbers)<=100
思路
如果有两个字符串a,b,若a + b < b + a, 显然我们希望a排在b的前面,因为a排在前面可以使结果更小。于是我们就自定义排序规则,那么最后的结果肯定是最小的。
import functools
# -*- coding:utf-8 -*-
class Solution:
def cmp(self,a,b):
if a+b<b+a:
return -1
elif a+b>b+a:
return 1
else:
return 0
def PrintMinNumber(self, numbers):
res = ""
NumStr = list(map(str,numbers))
NumStr.sort(key = functools.cmp_to_key(self.cmp))
for i in NumStr:
res += i
return res
关于Python3中sort自定义排序
在python3.x中,移除了cmp函数,如果需要自定义比较,需要借用functools模块来完成
temp = [1,2,3]
def compare(a,b):
if a>b:
return -1
elif a<b:
return 1
else:
return 0
temp.sort(key=functools.cmp_to_key(compare))
temp
其中比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。