刷題刷到一道覺得特有價值的排序 題,今天和大家分享一下:
輸入乙個非負整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。
示例 1:
輸入: [10,2]示例 2:輸出:
"102
"
輸入: [3,30,34,5,9]說明:此題求拼接起來的 「最小數字」 ,本質上是乙個排序問題。輸出:
"3033459
"
排序判斷規則:設 nums 任意兩數字的字串格式 x 和 y ,則
根據以上規則,套用任何排序方法對 numsnums 執行排序即可。
演算法流程:
複雜度分析:
時間複雜度o(nlogn) : n 為最終返回值的字元數量( strs列表的長度 ≤n );使用快排或內建函式的平均時間複雜度為o(nlogn) ,最差為 o(n^2) 。
空間複雜度o(n) : 字串列表 strs占用線性大小的額外空間。
看懂思路,寫**還是非常簡單的。首先我先寫一下比較low的氣泡排序來做(為什麼用這麼low的?因為就冒泡背的最熟hhhh)
nums = [3,5,9,30,34]但是冒泡的時間複雜度比較高o(n^2),所以我們可以用快排來實現:defbubblesort(num):
num =list(map(str,num))
for i in range(len(num)-1):
for j in range(len(num)-i-1):
if num[j] + num[j+1] > num[j+1] +num[j]:
num[j],num[j+1] = num[j+1],num[j]
return
"".join(num)
print(bubblesort(nums))
首先為了直觀,我在這裡先用寫乙個快排的簡單排序**,如下:
#接下來我們就用快排來解題,思路是一樣的,只需要把排序規則那裡做一下改動即可快速排序
nums = [3,5,9,30,34]
deffsort(nums,l,r):
if l >=r:
return
i, j =l, r
while i
while nums[j] >= nums[l] and i
j -= 1
while nums[i] <= nums[l] and i
i += 1nums[i], nums[j] =nums[j], nums[i]
nums[i], nums[l] =nums[l], nums[i]
fsort(nums,l, i - 1)
fsort(nums,i + 1, r)
return
nums
print(fsort(nums,0,len(nums)-1))
nums = [3,30,34,5,9]在這裡呢我先將**寫在這裡:defminnumber(nums):
deffast_sort(l , r):
if l >=r:
return
i, j =l, r
while i
while strs[j] + strs[l] >= strs[l] + strs[j] and i
j -= 1
while strs[i] + strs[l] <= strs[l] + strs[i] and i
i += 1strs[i], strs[j] =strs[j], strs[i]
strs[i], strs[l] =strs[l], strs[i]
fast_sort(l, i - 1)
fast_sort(i + 1, r)
strs = [str(num) for num in
nums]
fast_sort(0, len(strs) - 1)
return
''.join(strs)
print(minnumber(nums))
nums = [3,30,34,5,9]在這裡用到了python內建的排序函式sort,它的排序規則用函式sort_rule來完成。import
functools
defminnumber(nums):
defsort_rule(x, y):
a, b = x + y, y +x
if a >b:
return 1
elif a
return -1
else
:
return
0 strs = [str(num) for num in
nums]
strs.sort(key =functools.cmp_to_key(sort_rule))
return
''.join(strs)
print(minnumber(nums))
#內建函式完成排序
nums = [3,30,34,5,9]
defsort_rule(x, y):
a, b =x, y
if a >b:
return 1
elif a
return -1
else
:
return
0nums.sort(key =functools.cmp_to_key(sort_rule))
print(nums)
一道演算法題,引發的思考
引言 有人問我這樣乙個問題,希望寫出 實現 有p0,p1兩點座標,組成乙個線段,求此線段與x點的的距離 我並不知道,如何完全的實現此功能,因為求點與線的公式,我記得是高中知識,但是我已經忘得差不多了,只是知道勾股定理算兩點間距離,直線方程有個斜率,如果給我時間去細想的話,應該可以理出頭緒,得到個寫此...
考考你 一道題引發的小思考
有位朋友給出了一道題 有兩列火車相距100千公尺,在同一條軌道上相向行駛,一列火車的速度是每小時30千公尺,另一列的速度是每小時20千公尺。當兩列火車相距100千公尺時,乙隻鳥以120千公尺的時速開始從火車a飛向火車b,到達後再飛回火車a,如此往復直至兩列火車相撞。當兩列火車相撞時,鳥一共飛了多遠?...
一道面試題引發的思考
首先我們給出這道面試題的 以及題目 lista new arraylist list.add 1 list.add 2 for string item list 問 上段 執行會報錯嗎?如果把 1 換成 2 會報錯嗎?為什麼?首先給出答案 上面這段 執行不會報錯。把 1 換成 2 再執行就會報錯。為...