* 解题思路:

 * 先将整型数组转换成字符数组,然后将String数组排序,最后将排好序的字符串数组拼接出来。关键就是制定比较规则
 * 排序规则如下:
 * 若ab > ba 则 a > b,
 * 若ab < ba 则 a < b,
 * 若ab = ba 则 a = b;
 * 其中比较规则如下:
自定义比较规则:比较两个字符串s1, s2大小时,先将它们拼接起来,比较s1+s2,和s2+s1哪个大,若s1+s2大,则s2应该放前面,反之亦然。 * 比如"3"<"31"但是"331">"313",所以要将二者拼接起来再进行比较
排序:
可以使用list.sort()方法来排序,此时list被修改。也可用sorted(list),此时list不变,可将函数返回值赋给另一个变量:newlist=sorted(list)。另一个不同就是list.sort()方法仅被定义在list中,而sorted()方法对所有的可迭代序列(如字典等)都有效
python3以前的sorted函数和list.sort()函数都可以加入cmp参数,cmp参数指定一个函数,该函数需要两个参数,从而实现对list的两两元素进行比较
classSolution:
    def PrintMinNumber(self, numbers):
        # write code here
        ifnot numbers:return""
        numbers = list(map(str,numbers))
        numbers.sort(cmp=lambda x,y:cmp(x+y,y+x))#cmp参数指定一个函数,该函数需要两个参数
        return'0'ifnumbers[0]=='0'else''.join(numbers)

2)key参数/函数

从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数只有一个参数且返回一个值用来进行比较,此函数将在每个元素比较前被调用。这个技术是快速的因为key指定的函数将准确地对每个元素调用。例如:

>>> student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12),('dave', 'B', 10) ]

>>> sorted(student_tuples, key=lambda student: student[2]) # key函数指定一个函数,且该函数只有一个参数
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
同样的技术对拥有命名属性的复杂对象也适用,例如:
>>> class Student:
def __init__(self, name, grade, age):
    self.name = name
    self.grade = grade
     self.age = age
def __repr__(self):
      return repr((self.name, self.grade, self.age))
>>> student_tuples = [ ('john', 'A', 15), ('jane', 'B', 12),('dave', 'B', 10) ]
>>> sorted(student_tuples, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
3)list.sort()和sorted()都接受一个参数reverse(True or False)来表示升序或降序排序

4)cmp函数:python2.4前,sorted()和list.sort()函数没提供key参数,但提供cmp参数定比较函数。此方法在其他语言中也普遍存在。在python2.x中cmp参数指定的函数需要2个参数,然后返回负数表示小于,0表示等于,正数表示大于,用来进行元素间的比较。例如:

>>> def numeric_compare(x, y):
            return x - y
>>>sorted([5, 2, 4, 1, 3], cmp=numeric_compare)#cmp参数让用户指定比较函数,且该函数需要两个参数
[1, 2, 3, 4, 5]
python3.0中,移除了cmp参数,若想将2.x的cmp函数代码移植到3.x,需将cmp函数转化为key函数,即
from functools import cmp_to_key   #从python2.7,cmp_to_key()函数被增加到了functools模块中。
sorted(numbers,key=cmp_to_key(self.comp))
 
# -*- coding:utf-8 -*-
from functools import cmp_to_key
class Solution:
    
    def comp(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 not numbers: 
            return ""
        numbers = list(map(str, numbers))
        print('numbers:',numbers)
        temnumbers=sorted(numbers,key=cmp_to_key(self.comp))
        print('temnumbers:',temnumbers)
        temnumbers=int(''.join(str(x) for x in temnumbers))
        return temnumbers
        #return int(''.join(x for x in numbers))
s=Solution()
s1=s.PrintMinNumber([34,3,31])  
print(s1)

剑指offer第32题:把数组排成最小的数及关于list.sort()和sorted( Iterable object )函数的相关知识的更多相关文章

  1. 剑指offer(32)把数组排成最小的数

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

  2. 【剑指Offer】32、把数组排成最小的数

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

  3. 剑指Offer - 九度1504 - 把数组排成最小的数

    剑指Offer - 九度1504 - 把数组排成最小的数2014-02-06 00:19 题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输 ...

  4. 剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)

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

  5. 《剑指Offer》算法题——“旋转数组”的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个非递减序列的一个旋转,输出旋转数组的最小元素.例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数 ...

  6. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...

  7. 《剑指offer》— JavaScript(32)把数组排成最小的数

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

  8. 剑指offer 面试32题

    面试32题: 题目:从上到下打印二叉树 题:不分行从上到下打印二叉树 解题代码: # -*- coding:utf-8 -*- # class TreeNode: # def __init__(sel ...

  9. 牛客网剑指offer第13题——调整数组顺序使得奇数位于偶数前面

    题目来源:剑指offer 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变 ...

随机推荐

  1. oracle 存储过程循环打开游标数据处理

    2017-07-24 14:12:42 SQL内容: 1.一次性检索 100000 条数据. 2. 1000 条提交一次. 3.超过 100000 万条,重新打开游标,重新检索. pl/sql内容如下 ...

  2. MySQL 存储过程 if语句

    MySQL  存储过程 if语句 MySQL IF语句允许您根据表达式的某个条件或值结果来执行一组SQL语句. 要在MySQL中形成一个表达式,可以结合文字,变量,运算符,甚至函数来组合.表达式可以返 ...

  3. python函数注释,参数后面加冒号:,函数后面的箭头→是什么?

    https://blog.csdn.net/sunt2018/article/details/83022493

  4. PYTHON -- 基础3

    1.数据类型 1.int 类型 用于计算 1.1 bit_length() 转换为2进制的最小位置 有效的 i = 5 print(i.bit_length()) i 二进制 i.bit_length ...

  5. expect简单自动交互-用于密码、命令输入

    1. 安装expect #yum -y install expect 2. 新建.exp文件,用于ssh交换机 #vi exp.exp #!/bin/expect set f [open ipfile ...

  6. Django-CSRF的使用

    1. 为什么要有csrf_token? 防止跨站请求伪造 2. Django中如何使用? urls.py: urlpatterns = [ # 测试跨站请求伪造 (CSRF) url(r'^csrf_ ...

  7. angular 引入编辑器以及控制器的学习和理解。。。

    在angular中引入编辑器的时候花了很长时间,然后发现自己以前根本就没好好用过angular,因为项目是接手的学姐的,学姐又是接手的学姐的,到我这里就只是写写页面的事了. 引入编辑器差了好多好多资料 ...

  8. Kubernetes介绍及基本概念

    kubernetes介绍 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S.K8S是Google内部一个叫Borg的容器集 ...

  9. linux 7 关闭防火墙 开启sshd服务

    启动一个服务:systemctl start firewalld.service关闭一个服务:systemctl stop firewalld.service重启一个服务:systemctl rest ...

  10. Django_URL

    视图函数介绍 视图一般都写在app的views中,并且视图的第一个参数永远都是request(HttpRequest)对象.这个对象存储了请求过来的所有信息,包括携带的参数以及一些头部信息等.再视图中 ...