陣列中組成最小的數

2021-06-23 06:08:20 字數 1026 閱讀 4496

題目:輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。例如輸入陣列,則輸出這兩個能排成的最小數字32132。請給出解決問題的演算法,並證明該演算法。

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

根據題目的要求,兩個數字m

和n排成的數字mn和nm,如果mn

接下來我們考慮怎麼去拼接數字,即給出數字m和n,怎麼得到數字mn和nm並比較它們的大小。直接用數值去計算不難辦到,但需要考慮到的乙個潛在問題是m和n都在int能表達的範圍內,但把它們拼起來的數字mn和nm就不一定能用int表示了。所以我們需要解決大數問題。乙個非常直觀的方法就是把數字轉換成字串。

另外,由於把數字m和n拼接起來得到的mn和nm,它們所含有的數字的個數肯定是相同的。因此比較它們的大小只需要按照字串大小的比較規則就可以了

#include#include#includeconst int g_maxnumberlength=10;

char* g_strcombine1=(char*)malloc((2*g_maxnumberlength+1)*sizeof(char));

char* g_strcombine2=(char*)malloc((2*g_maxnumberlength+1)*sizeof(char));

//定義比較規則

int compare(const void* strnumber1,const void* strnumber2)

void printminnumber(int* numbers,int length)

{ if(numbers==null||length<=0)

return;

char** strnumbers=(char**)malloc(length*sizeof(int));

for(int i=0;i

結果:

把陣列中的數字拼接起來組成最小的數

例如輸入陣列,則拼接起來的最小數為321323。假設有兩個數m和n,我們定義mnm,則有m n。m和n都是int範圍內的數字,它們拼接起來的數字很可能超出int所能表示的範圍。在這裡,我們把數字轉換為字串。將數字按上面定義的比較方式從小到大排序,那麼得到的組合數字最小。相關數學證明可以網上搜尋。原始...

陣列 DP 陣列的最小不可組成和

題目 腦客愛刷題 給定乙個全是正數的陣列arr,定義一下arr的最小不可組成和的概念 1,arr的所有非空子集中,把每個子集內的所有元素加起來會出現很多的值,其中最小的記為min,最大的記為max 2,在區間 min,max 上,如果有一些正數不可以被arr某乙個子集相加得到,那麼這些正數中最小的那...

遞增陣列中絕對值最小的數

求乙個遞增的整數陣列中,絕對值最小的數。陣列中可以有正負整數和0,要求複雜度 o logn 思路 有序陣列,用二分查詢。如果乙個數大於零,那麼要找的數在他左邊或者是他本身。如果乙個數小於零,那麼要找的數在他右邊或者是他本身。遞迴查詢。public class solution if array en...