輸入一個正整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。
- [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])