本文算法使用python3實現python
輸入一個正整數數組,把數組裏全部數字拼接起來排成一個數,打印能拼接出的全部數字中最小的一個。例如輸入數組 $ [3,32,321] $ ,則打印出這三個數字能排成的最小數字爲 $ 321323 $ 。
時間限制:1s;空間限制:32768K算法
大體思路:
(1)咱們能夠先思考只有兩個數字的狀況: $ [3,32] $ ,能夠看出來 $ 332 > 323 $ 所以須要把數組改變爲 $ [32,3] $ ;
(2)對於有三個數字的狀況: $ [3,32,321] $ 咱們兩兩進行比較, $ 332 > 323 $ 因而,將 $ 3 $ 與 $ 32 $ 交換位置變成 $ [32,3,321] $ 而 $ 3321 > 3213 $ 因而將 $ 3 $ 與 $ 321 $ 繼續交換位置到 $ [32,321,3] $ ;接着咱們繼續使用 $ 32 $ 進行比較,因爲 $ 32321 > 32132 $ 將 $ 32 與 321 $ 進行位置交換爲 $ [321,32,3] $ 此時,將數組連接起來變成 $ 321323 $ 即爲最小的數。
具體思路:
(1)先將數字列表轉化成字符串鏈表,這樣便於在一個字符串後面直接加上另一個字符串。也就是 $ "3" + "321" = "3321" $ 。
(2)構造一個比較函數,當 $ str1 + str2 > str2 + str1 $ 時咱們認爲字符串 $ str1 > str2 $ 。
(3)將字符串列表按照比較函數的規定進行冒泡排序(或其它方法排序),將定義爲」大」的字符串放到最後。而」小」的字符串放在前面。最後將字符串列表連接起來,即是所求。
注意:在python2.x中可直接對 sort() 函數進行比較函數cmp的傳參,能夠利用sort()函數直接對字符串列表進行排序。可是,對於python3.x取消了sort()函數中的cmp參數。python3.x
(1)方法一:數組
class Solution: def theMax(self, str1, str2): '''定義字符串比較函數''' return str1 if str1+str2 > str2+str1 else str2 def PrintMinNumber(self, numbers): """使用冒泡進行排序(把最大的放最後)""" string = [str(num) for num in numbers] res = [] flag = True count = len(string) - 1 while flag and count > 0: flag = False for i in range(len(string)-1): if self.theMax(string[i], string[i+1]) == string[i]: temp = string[i] del string[i] string.insert(i+1, temp) flag = True count -= 1 string = ''.join(string) return string
(3)方法二(僅python2.x可用):函數
class Solution: def cmp(self, a, b): '''定義比較函數''' ab = int(a+b) ba = int(b+a) return 1 if ab > ba else -1 def PrintMinNumber(self, numbers): string = [str(num) for num in numbers] string.sort(self.cmp, reverse=True) return ''.join(string)