* 解题思路:

 * 先将整型数组转换成字符数组,然后将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. canvas 水波纹

    <!DOCTYPE html> <html> <head> <title>水波背景</title> <meta charset=&qu ...

  2. php安全开发(1)文件包含漏洞

    开发过程总结的漏洞: 一,,如何造成包含漏洞:在通过函数包含文件时,由于没有对包含的文件名进行有效的过滤处理,被攻击者利用从而导致了包含了Web根目录以外的文件进来,就会导致文件信息的泄露甚至注入了恶 ...

  3. 3D视图的2D展示

    效果图:预览 :预览 如何在2d界面显示3d图形? 如果把屏幕的中心作为视点的中心位置,那由远及近的物体应该是逐渐缩小的,而且是逐渐模糊的, 我们首先获取元素相对于中心点的距离,然后抽取这个距离的百分 ...

  4. 使用js如何设置、获取盒模型的宽和高

    第一种: dom.style.width/height 这种方法只能获取使用内联样式的元素的宽和高. 第二种: dom.currentStyle.width/height 这种方法获取的是浏览器渲染以 ...

  5. 利用python解析地址经纬度和利用经纬度定位地址

    解析地址经纬度 from geopy.geocoders import Nominatim try: geolocator = Nominatim() location = geolocator.ge ...

  6. 老男孩Python九期全栈学习笔记4

    ---恢复内容开始--- day4 1.作业回顾 1.有变量name = 'aleX leNb',完成如下操作: 1)移除 name 变量对应的值两边的空格,并输出处理结果 2)移除 name 变量左 ...

  7. JS-3

    运算符 数学运算符 + - * / %(取模运算符) js内置一个对象叫Math,Math提供了很多关于计算的方法,常见的 // 随机数 console.log(Math.random()); // ...

  8. linux网络编程基础--(转自网络)

    转自 http://www.cnblogs.com/MyLove-Summer/p/5215287.html Linux下的网络编程指的是socket套接字编程,入门比较简单. 1. socket套接 ...

  9. SSM连接数据库自动生成问题

    错误的结果为: 程序里面写的sql语句放在数据库里面去查询能查询到数据,但是程序里面查询时候,返回的结果为null 记录一下 我出现的原因是: 数据库的字段  account_id    accoun ...

  10. DOM艺术基础练习

    每个月对于学习的JAVASCRIPT进行总结,加油 主要应用知识点   :