剑指offer(11)把数组排成最小的数——python

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

# -*- coding:utf-8 -*-
class Solution:
    def compare(self,num1,num2):
        t = str(num1)+str(num2)
        s = str(num2)+str(num1)
        if t>s:
            return 1
        elif t<s:
            return -1
        else:
            return 0
 
    def PrintMinNumber(self, numbers):
        # write code here
        if numbers is None:
            return ""
        lens = len(numbers)
        if lens ==0 :
            return ""
        tmpNumbers = sorted(numbers,cmp=self.compare)
        return int(''.join(str(x)for x in tmpNumbers))
 
print Solution().PrintMinNumber([3,32,321])

思路很简单,就是将列表中的数两两按字符串相加,比较大小并排序,最后整合排序数列。
这里要说一下sort函数中的cmp参数,这个参数在py3中已经没有了,具体的用法是,传入一个函数,这个函数将待排序列表中的元素两两比较,如果返回为正,则交换两者的位置,即y在前x在后,否则x在前y在后。

例如:

def mycmp1(x,y):  #升序排列
    return x-y
def mycmp2(x,y): #降序排列
    return y-x
    #升序排列
numbers = [5,2,9,7]
def mycmp1(x,y):
        return x-y
numbers.sort(cmp = mycmp1)
print numbers

>>>
[2, 5, 7, 9]

#降序排列
numbers = [5,2,9,7]
def mycmp2(x,y):
        return y-x
numbers.sort(cmp = mycmp2)
print numbers

>>>
[9,7,5,2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值