[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