剑指offer ----- 把数组排成最小的数---cmp

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

2.思路:

属于两两比较,判断的大小依据是组合的形式
比如【2,3,1,5,4】,那么2和3组合 23 < 32 所以2在前3在后面,按照这个原理两两比较,最终得到了符合的排列。这里的话当然是12345.

实现:

主要是如何用python优美的是实现上述的想法,用到了python中的sort.还有cmp,还有lambda的混合组合,这是一个很重要的技巧,用这个我们对于一些连续的的会更好的处理。

例子1: 一行求1000的阶乘的Python代码
print reduce(lambda x,y:x*y, range(1, 1001))

解析上面一句话:
首先是range(1,1001) 取头不取尾巴,也就是一次给出了1.。。。。1000等数

其次是lambda reduce(functionA,iterableB),functionA为需要两个变量的函数,并返回一个值。iterableB为可迭代变量,如List等。reduce函数将B中的元素从左到右依次传入函数A中,再用函数A返回的结果替代传入的参数,反复执行,则可将B reduce成一个单值。在此,是将1到1000的连续整数列表传入lambda函数并用两个数的积替换列表中的数,实际的计算过程为:(…((1×2)×3)×4)×…×1000),最后的结果即1000的阶乘。
不过redude()在python3好像不管用了。 而是需要调用这句话:

from functools import reduce

最后就是lambda:
在这里插入图片描述
cmp(x,y) 函数用于比较2个对象,如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。

例子:对比每个数组的第二位。

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L,cmp=lambda x,y:cmp(x[1],y[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

用key的方法也可以。

>>>L = [('b',2),('a',1),('c',3),('d',4)]
>>>print sorted(L, key=lambda x:x[1]))
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]

所以先是用sort然后用cmp然后用lambda定义新的函数即可,下面就是我们用这样的方法来实现两两比较并且得到最终的序列。然后再将序列拼接起来。sorted 方法是需要三个参数的 array, key, cmp, cmp=lambda s1,s2:cmp(。。。)所以重要的是我们对第二个cmp的定义呀!

cmp 就是其中一个参数。

if(numbers is None or len(numbers)==0):return ""
numbers=list(map(str,numbers))
numbers.sort(cmp=lambda x,y:cmp(x+y,y+x)) #对比谁比较大,谁靠前。第一个cmp就是对比,第二个cmp是获得第一个cmp的数值然后在给出排序结果。
return "".join(numbers).lstrip()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值