劍指 Offer 45 把陣列排成最小的數

2021-10-08 15:25:53 字數 1305 閱讀 9478

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

示例 1:

輸入: [10,2]

輸出: 「102」

示例 2:

輸入: [3,30,34,5,9]

輸出: 「3033459」

題目本質是乙個排序問題。關鍵在於排序的規則有所變化

要讓輸出的數字最小,且是以字串的形式。

規律 『10』+『2』<『2』+『10』 ,所以 『10』應該放在『2』前面,也就是再這種規則下,『10』比『2』小。

因此我們以 a+b >b +a 則 a>b ; a+b < b+a 則 aclass

solution

:def

minnumber

(self, nums)

->

str:

li =

[str

(i)for i in nums]

quick_sort(li,0,

len(li)-1

)return

''.join(li)

defpotation

(li,left,right)

: temp = li[left]

while leftwhile left+temp>=temp+li[right]

: right-=

1 li[left]

= li[right]

#每次找到需要交換的數後,先填坑,再繼續

while left+temp<=temp+li[left]

: left+=

1 li[right]

= li[left]

#每次找到需要交換的數後,先填坑,再繼續

li[left]

,li[right]

= li[right]

,li[left]

li[left]

= temp

return left

defquick_sort

(li,left,right)

:if left#只能用if 不能用while ,否則死迴圈

mid = potation(li,left,right)

quick_sort(li,left,mid-1)

quick_sort(li,mid+

1,right)我太蠢了,因為忽略了if 和while的區別,導致一直死迴圈,還找了好久原因。

所以只判斷的時候,一定就用if就可以了,需要重複執行再用while。不要混用。

劍指offer 45 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。思路1 根據全排列,將三個數字的全排列全寫出來,然後比較大小,這種辦法在數比較多時,效率不高。思路2 先比較前兩個數字m和n排列的大小 mn和n...

劍指Offer 45 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例 輸入陣列,列印321323。排列出所有的組合,比較出最小的,輸出。時間複雜度 o n 空間複雜度 o n 考察最小組合的形式,遵從下面的規律 1 首位小的靠前 2 首位相同,次位小的靠前 3 位數少的靠前...

把陣列排成最小的數(劍指offer 45)

輸入乙個正整數陣列,把陣列裡所有的數拼接為乙個數,列印出能拼接出的所有數字中最小的乙個。比如輸入 輸出 321323.這道題其實是希望我們能找到乙個排序規則,陣列根據這個排序規則排列後能排成乙個最小的數。要確定排序規則,就要比較兩個數字,也就是給出兩個數字m n,我們需要確定乙個規則判斷m和n哪個應...