演算法17 把陣列排成最小的數

2022-07-05 18:12:10 字數 2100 閱讀 9413

【題  目】輸入乙個正整數陣列,將他們連線起來排成乙個數,輸出所有排出的數字中最小的乙個。例如:輸入陣列『32,321』,輸出所能排出的最小數為:32132.請給出該問題的演算法。

【思  路】我們希望能夠找到一種規則,按照這種規則排列出來的數是最小的數。要確定排序的規則,我們就必須知道,對於任意兩個正整數a和b,如果確定乙個規則,使得按照該問題進行排序能得到最小的數,也就是要比較a和b的值,而這種比較不是普通的數值的大小。

對於數字a和b,排列的結果為ab和ba,如果ab小於ba,應該輸出ab,即a排在b的前面,也就是a接下裡的問題是:給出數字a和b,如果拼接得到ab或者ba,然後比較他們的大小?如果直接用數值進行拼接當然是可以的,但是我們考慮到a和b都是int型的,如果拼接後得到數字超出int型的範圍導致結果溢位該怎麼辦?很自然我們想到可以現將整數都轉換成字串型別,然後在連線。

如何比較ab和ba的大小?很顯然按字典序直接比較ab字串和ba字串的值就可以了。根據這個思路,我們可以寫出如下的**:

1 #include

2 #include

3 #include

4 #include

5using

namespace std;67

//每個整數最長有10個數字組成;

8const

int maxdigits = 10;910

//兩個臨時字串用於存放ab和ba

11char* strcombine1 = new

char[2*maxdigits+1];

12char* strcombine2 = new

char[2*maxdigits+1];

1314

//定義a和b的比較規則;

15//

定義如果ab

16//

定義如果ba

17//

定義如果ab=ba,則a=b;

18int comp(const

void* a,const

void* b)

19 30

31void printminnumber(int numbers,int length)

32 45

46//

按照定義的規則進行快速排序

47 qsort(strnumbers,length,sizeof(char*),comp);

4849

//輸出結果

50for(i = 0;i < length;++i)

51

54 printf("

\n");

5556

//delete

57for(i = 0;i < length;++i)

58

61//

delete

62 delete strnumbers;

63 }

6465

int main()

66 77

78 cout<

the minnumber from your array is:

"<79 printminnumber(array,n);

8081 delete array;

82return

0;83 }

執行結果如下:

其實該問題還有一問,是要求證明該演算法是正確的,筆者竊以為對於我們找出的排序規則來說這是顯然的。這就好比如果我們定義了比較兩個數大小的規則,比如就是最簡單的數值比較規則,然後有乙個陣列,要按照這個比較規則進行排序,它排出來的序是違反這個規則的?顯然是不可能的。所以只需確定這個比較的規則是正確的就可以了,而比較規則的正確性,這裡是借助字串的比較規則來實現的,完全沒有問題。所以個人感覺這個證明是不必要的。當然如果對這個說法有疑問,要看證明過程,請移步這裡。

references:  

程式設計師面試題精選100題:注:1

)本部落格所有的**環境編譯均為

win7+vc6

。所有**均經過博主上機除錯。

2)博主

python27

演算法 把陣列排成最小的數

輸入乙個正整數陣列,把陣列裡所有數字拼接起排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。核心思想是,比較a和b,把他們拼起來,ab和ba哪個大,如果a大於b,那麼交換。這樣一遍迴圈,可以將最大的放到陣列最後,多迴圈幾次,就是我們想要的...

把陣列排成最小的數

分析 這是09 年6這道題其實是希望我們能找到乙個排序規則,根據這個規則排出來的陣列能排成乙個最小的數字。要確定排序規則,就得比較兩個數字,也就是給出兩個數字m 和n,我們需要確定乙個規則m 和n哪個更大,而不是僅僅只是比較這兩個數字的數值哪個更大。根據題目的要求,兩個數字m 和n排成的數字mn 和...

把陣列排成最小的數

問題描述 輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。例如輸入陣列,則輸出這兩個能排成的最小數字32132。請給出解決問題的演算法,並證明該演算法。思路 先將整數陣列轉為字串陣列,然後字串陣列進行排序,最後依次輸出字串陣列即可。這裡注意的是字串的比較函式需要重新定...