题目
输入一个正整数数组,把数组里面的所有属猪拼接起来成为一个数打印能拼接起来的所有数字中最大/最小的那个。
思考
直观想法就是求出这个数组中所有数字的全排列,然后拼接起来,再比较大小即可,当然复杂度过高。
另一个想法,我们可以定义一个排序规则,如下:
如果两个数m,n能拼接成数字mn,nm,如果mn>nm,则m应该在n前面,反之亦然
根据这个排序规则,我们可以重新排列数组,将排列好的数组拼接起来输出即可'为了方便比较,并且防止数据溢出(比如C语言),采用字符串的方式拼接。我们很容易可以写出如下代码:
def compare(strNum1, strNum2): newStrNum1 = strNum1 + strNum2 newStrNum2 = strNum2 + strNum1 if newStrNum2 > newStrNum1: return -1 elif newStrNum2 == newStrNum1: return 0 else: return 1
问题
排序规则定义好了,但是问题来了,一般的 sorted 排序函数 都有相应的 cmp函数,用来定制化排序的比较方法。但是python3的sorted函数已经删去了cmp参数,真不能跑去用python2吧
解决方案
由于python3中sorted函数除去compare函数,无法自定义排序规则,所以使用内置的函数,将cmp函数转化为key的值
Note:
functools.cmp_to_key() 将 cmp函数 转化为 key。
cmp函数的返回值 必须为 [1,-1,0]
python
from functools import cmp_to_key def compare(strNum1, strNum2): """ 返回最小排列的定义,如果需要最大,将返回值的+1、-1调换即可 """ newStrNum1 = strNum1 + strNum2 newStrNum2 = strNum2 + strNum1 if newStrNum2 > newStrNum1: return -1 elif newStrNum2 == newStrNum1: return 0 else: return 1 def print_min_nums(nums): if not nums: return 0 arr = [str(i) for i in nums] newarr = sorted(arr,key=cmp_to_key(compare)) return "".join(newarr) if __name__ == '__main__': print(print_min_nums([3,32,321]))
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Python实现堆排序的方法详解,包括了Python实现堆排序的方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python实现堆排序的方法。分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是一种原地排序算法,除了输入数组以外只占用常数个元素空间。 堆(定义):(
本文向大家介绍thinkPHP自定义类实现方法详解,包括了thinkPHP自定义类实现方法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了thinkPHP自定义类实现方法。分享给大家供大家参考,具体如下: 1.通过Model调用 没有继承Model,否则会因为表不存在而报错。 调用, 调用确实方便,但是总感觉有点不合理。这个D毕竟是操作数据库的。 2.通过引入类实现,把类放到ORG下
问题内容: 我有一个问题:这是由ElementTree库形成的列表列表。 word1..4可能包含Unicode字符,即(â,ü,ç)。 我想按我的自定义字母对列表列表进行排序。 我知道如何从这里按python中的单词对自定义字母进行排序 我也知道如何从此处http://wiki.python.org/moin/HowTo/Sorting按键排序 问题是我找不到如何应用这两种方法对“列表列表”进行
本文向大家介绍Python CategoricalDtype自定义排序实现原理解析,包括了Python CategoricalDtype自定义排序实现原理解析的使用技巧和注意事项,需要的朋友参考一下 CategoricalDtype自定义排序 当我们的透视表生成完毕后,有很多情况下需要我们对某列或某行值进行排序。排序有很多种方法。例如sort_index及sort_values函数也可以对数据进行
本文向大家介绍Python实现快速排序和插入排序算法及自定义排序的示例,包括了Python实现快速排序和插入排序算法及自定义排序的示例的使用技巧和注意事项,需要的朋友参考一下 一、快速排序 快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所
本文向大家介绍C#使用IComparer自定义List类实现排序的方法,包括了C#使用IComparer自定义List类实现排序的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#使用IComparer自定义List类实现排序的方法。分享给大家供大家参考。具体如下: List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(