前言
題目
輸入一個正整數數組,把數組里面的所有屬豬拼接起來成為一個數打印能拼接起來的所有數字中最大/最小的那個。
思考
直觀想法就是求出這個數組中所有數字的全排列,然后拼接起來,再比較大小即可,當然復雜度過高。
另一個想法,我們可以定義一個排序規則,如下:
如果兩個數m,n能拼接成數字mn,nm,如果mn>nm,則m應該在n前面,反之亦然
根據這個排序規則,我們可以重新排列數組,將排列好的數組拼接起來輸出即可’為了方便比較,並且防止數據溢出(比如C語言),采用字符串的方式拼接。我們很容易可以寫出如下代碼:
python
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]))