劍指Offer對答如流系列 把陣列排成最小的數

2022-08-30 02:12:09 字數 953 閱讀 8476

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這3個數字能排成的最小數字321323。

之前我們做過字元全排列的習題 劍指offer對答如流系列 - 字串的排列,但是將演算法思想應用到這一題的話,效果不好,求出所有的組合,再計算出組合的最小值,這效率該多低啊。

我們還要進一步**,看看有沒有不錯的規律,供我們使用。

因為數字拼接後的長度一樣,拼接後的結果大亦或是小 首先取決於最高位的數字,然後再低位。

既然這樣,我們定義一下數學模型:

對於數字m和n,可以拼接成mn和nm,如果mn

在求解的時候:拼接m和n,要考慮到大數問題,因此將m和n拼接起來的數字轉換成字串處理。

使用 string.compareto 方法:

compareto() 的返回值是int, 它是先比較對應字元的大小(ascii碼順序)

1、如果字串相等返回值0

2、如果第乙個字元和引數的第乙個字元不等,結束比較,返回他們之間的差值(ascii碼值)(負值前字串的值小於後字串,正值前字串大於後字串)

3、如果第乙個字元和引數的第乙個字元相等,則以第二個字元和引數的第二個字元做比較,以此類推,直至比較的字元或被比較的字元有一方全比較完,這時就比較字元的長度.

public string printminnumber(int  numbers) 

arraylistlist = new arraylist<>();

for(int number:numbers)

list.sort((s1, s2) -> );

stringbuilder sb= new stringbuilder();

for(string str:list)

return sb.tostring();

}

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...