【題 目】輸入乙個正整數陣列,將他們連線起來排成乙個數,輸出所有排出的數字中最小的乙個。例如:輸入陣列『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。請給出解決問題的演算法,並證明該演算法。思路 先將整數陣列轉為字串陣列,然後字串陣列進行排序,最後依次輸出字串陣列即可。這裡注意的是字串的比較函式需要重新定...