一道題引發的排序思考 把陣列排成最小的數

2022-08-22 03:36:10 字數 3099 閱讀 2931

刷題刷到一道覺得特有價值的排序 題,今天和大家分享一下:

輸入乙個非負整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。

示例 1:

輸入: [10,2]

輸出:

"102

"

示例 2:

輸入: [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]

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))

但是冒泡的時間複雜度比較高o(n^2),所以我們可以用快排來實現:

首先為了直觀,我在這裡先用寫乙個快排的簡單排序**,如下:

#

快速排序

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]

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))

在這裡用到了python內建的排序函式sort,它的排序規則用函式sort_rule來完成。

#

內建函式完成排序

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 再執行就會報錯。為...