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()