[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。 輸入10個整數,將其中最小的數與第一個數對換,把最大的數與最后一個數對換。 輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。 劍指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。 劍指offer(Java版)第一題:在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的,但不知道有幾個數字重復了,也不知道每個數字重復了幾次。 *請找出數組中任意一個重復的數字。 *例如,如果輸入長度為7的數組{2, 3, 1, 0, 2, 5, 3},那么對應的輸出是重復的數字2或者3。 Leetcode練習(Python):數組類:第41題:給你一個未排序的整數數組,請你找出其中沒有出現的最小的正整數。你的算法的時間復雜度應為O(n),並且只能使用常數級別的額外空間。 輸入一個int型正整數,輸出它的二進制形式中數字1的個數 給定一個正整數數組,設為nums,最大為100個成員,求從第一個成員開始,正好走到數組最后一個成員,所使用的最少步驟數。 輸入一個字符串,內有數字和非數字字符,將其中連續的數字作為一個整數,依次存放到一數組a中。統計共有多少個整數,並輸出這些數。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM