本文算法使用python3實現
1 題目描述:
輸入一個正整數數組,把數組里所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組 $ [3,32,321] $ ,則打印出這三個數字能排成的最小數字為 $ 321323 $ 。
時間限制:1s;空間限制:32768K
2 思路描述:
大致思路:
(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參數。
3 程序代碼:
(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)