* 解题思路:

 * 先将整型数组转换成字符数组,然后将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. 算法 set / multiset -- lower_bound()的二分搜索

    lower_bound() 在数组中搜索时 搜不到 返回 .end(), 若需要返回0,用upper_bound()-lower_bound() 若要返回下一个下标  则需要在set / multis ...

  2. YARN详解

    1.1      分布式资源调度框架 1.2.1          yarn的概念 Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协 ...

  3. springboot缓存注解——@Cacheable

    @Cacheable: 1,方法运行之前,先查询Cache(缓存组件),按照cacheName指定的名字获取(CacheManager获取相应缓存) 第一次获取缓存如果没有Cache组件会自会自动创建 ...

  4. .NetCore WebApi 添加 Log4Net

    一 .配置 1.vs2019 创建一个.net core web程序,选择webapi 2.项目中添加一个配置文件:添加--新建项--XML文件,命名为log4net.config 我使用的是log4 ...

  5. FPM二:简单的APPLICATION-TABSTRIP(OIF)

    1.新建WDA程序ZLYFPM002 2.新建视图2,窗口2,并将视图2分配到窗口2. 3.继承UIBB类IF_FPM_UI_BUILDING_BLOCK 4.创建WDA 应用程序: 5.创建WDA ...

  6. 欧姆龙PLC CP1E型号的90,91,190

    I/O存储区的CIO区,输入位CIO0-CIO99 对于NA型,模拟输入0和1将分别占用CIO90和CIO91 输出位CIO100-CIO199,对于NA型,模拟输出0将占用CIO190

  7. 我是如何通过学习拿到年薪80w

    本人做了5年Java,如今还是一个码农,天天写业务代码,直到2018年10月中旬遇到一位技术大牛,他给我一套技术思维导图让我又看到了希望!今天分享给各位想要提升.升职.加薪的你. 普通Java程序员与 ...

  8. implode() 数组元素组合函数

    定义和用法 implode() 函数把数组元素组合为一个字符串. 语法:implode(separator,array); 说明 虽然 separator 参数是可选的.但是为了向后兼容,推荐您使用使 ...

  9. 数据类型、运算符及Scanner类练习

    数字加密.要求输入一个四位的正整数,每位数字加5再除以10取余,并替换该数字,再千位数与个位数互换,十位数与百位数互换. import java.util.Scanner;/** * 加密数字问题 * ...

  10. servlet(3)

    常见的网络访问后缀: - .html : 网页 - .htm : 网页 - .php : php技术实现的动态网页 - .jsp : Java Server pages Java代码+HTML代码实现 ...