剑指offer45
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例1
输入: [10,2]
输出: “102”
这个题本质上还是一个排序问题,要解决的是如何定义元素的大小。比如示例1中,如何定义10和2的大小,从而使得排序好的数组的排序结果最小。
首先将整数数组转换为字符串数组。
令a = ‘10’,b = ‘2’
a+b = ‘102’
b+a = ‘210’
显然210 > 102,也就是a需要放在b的前面,使得拼接结果最小。
据此,我们就可以定义一个比较函数,对于输入的a,b,如果a+b > b+a,说明a“大于”b;否则a“小于”b。可以使用快速排序、堆排序等对齐进行排序。将排好序的数组拼接即可得到结果。
本文主要介绍python内置函数sorted,结合lamda进行排序
- 定义key = lambda x,y : 1 if x < y else -1 从小到大排序 x表示后面数字,如果后面数字大,则lambda=-1,需要进行交换
- 使用sorted(a,functools.cmp_to_key(key)),使用自定义比较方式对数组进行排序
import functools
def solve():
nums = map(str,nums)
cmp_max = lambda x,y:1 if x+y < y+x else -1 #x表示后面的数,y为前面的数
#cmp_min = lambda x,y: if -1 x+y < y+x else 1 #最小数
a = sorted(nums,key = functools.cmp_to_key(cmp_max))
return ''.join(a)
if __name__ == "__main__":
#从测试角度需要考虑:设计测试用例
a = [] #输入为空
a = [0,0] #输入全为0 边界条件
a = [1,41,3] #正常输入
a = [-1,2,3] #输入负数
此外,sorted还可以结合函数使用
def fun(a):
return len(a)
a = ['aa','bad','a']
sorted(a,key=fun) #按照数组每个元素的长度进行从小到大排序
sorted(a,key=fun,reverse=True) #照数组每个元素的长度进行从大到小排序