[Python]-输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。


输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

  • [3, 30, 34, 5, 9]
  • 一、需要对列表进行排列,取出相邻的两个元素,组成一个数,例如:ab , 如果ab < ba;则相应权重 a < b;使用这个规则对列表进行排序,得到的排序结果组合起来就是数字最小的一个。
  • 二、在Python2中的函数sorted(data, cmp=None, key=None, reverse=False)
    • 其中data 是等待排序的数据
    • cmp是带两个参数的比较函数:cmp(x, y);当 x < y时返回负数;当 x = y 时返回0;当x > y时返回正数。默认由小到大,返回值应该为负数。
    • (cmp函数会确定待排序列表中元素的权重,当cmp函数的返回值为 -1 时,表示权重 x < y ; 返回值为 0 时,权重 x = y; 返回值为 -1 时,权重 x > y)
    • --->由cmp函数确定待排序列表中的元素的权重, 其后sorted()函数会根据权重值对列表重新排序。
    • key是带有一个参数的函数:key(x),用来提取每个函数的值进行比较,默认值为None ,直接比较每个元素。
  • 总结一下,在sorted(data, cmp=None, key=None, reverse=False)函数中:
    • data是想要排序的itrrater,例如一个列表,列表中的每个元素可能是字典(需要设置参数key)
    • reverse, 决定是升序还是降序
    • key参数需要传递一个函数,有一个参数,一个返回值,可以对传入的iterrater的元素进行变换,然后按照返回的结果进行排序。
    • cmp(x, y)函数决定比较时元素权重谁大时小,会将iterrater中元素两两进行比较,当返回 -1 时认定权重 x < y;-->我们为您可以通过自定义cmp()函数来自定义比较规则.
Python2中可以重新定义比较规则
def sorted_role(x, y):              # 比较规则函数
    if int(str(x) + str(y)) < int(str(y) + str(x)):   # 对列表中两个元素拼接成的数字进行比较
        return -1               # ,确定相邻两个元素的先后位置,(返回-1 表示 前边权重小,后边权重大)
    if int(str(x) + str(y)) == int(str(y) + str(x)):# 使得列表顺序为组成数字最小的顺序
        return 0
    if int(str(x) + str(y)) > int(str(y) + str(x)):
        return 1
        
def PrintMinNumber(numbers):
    if not numbers:         # 列表中没有数据返回空值
        return ""
    numbers = sorted(numbers, cmp = sorted_role)    # 重新定义的排序规则生效。(权重由小到大依次排列)
    return ''.join([str(i) for i in numbers])       #将排好序的列表元素转化为字符串拼接起来,返回
Python3中的sort()函数
  • Python3中的sort()函数没有了cmp参数,需要使用from functools import cmp_to_key
from functools import cmp_to_key    # 导入需要使用的工具

def sorted_role(x, y):              # 重新定义的比较规则函数
    if int(str(x) + str(y)) < int(str(y) + str(x)):
        return -1                   # xy - yx < 0 时,应该 x在前, y 在后, 返回负值
    if int(str(x) + str(y)) == int(str(y) + str(x)):
        return 0
    if int(str(x) + str(y)) > int(str(y) + str(x)):
        return 1                    # xy - yx > 0 时,应该 y在前, x 在后, 返回正值


def PrintMinNumber(numbers):

    #key=cmp_to_key(sorted_role):启动新的排序规则
    numbers.sort(key=cmp_to_key(sorted_role))   
    return ''.join([str(i) for i in numbers])
  • 简化写法
from functools import cmp_to_key    # 导入需要使用的工具
def PrintMinNumber(numbers):
    # 定义匿名函数:当 ab - ba < 0时,a应该在前,b在后,返回负值。
    cmp = lambda a, b: int(str(a) + str(b)) - int(str(b) + str(a))
    numbers.sort(key=cmp_to_key(cmp))
    return ''.join([str(i) for i in numbers])


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字的最小的一个 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 把一个数组forEach循环出来的值用“,”拼接起来 剑指Offer(Java版)第五十六题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。 也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 面试题3:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3 剑指offer(Java版)第一题:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。 *请找出数组中任意一个重复的数字。 *例如,如果输入长度为7的数组{2, 3, 1, 0, 2, 5, 3},那么对应的输出是重复的数字2或者3。 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。 如何将一个数字字符串数组转化为数字整数数组? 删除数组元素 功能描述:有一个有序整数数组,要求输入一个数字, 在数组中查找是否有这个数,如果有,将该数从数组中删除, 要求删除后的数组仍然保持有序;
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM