程式設計題目 把陣列排成最小的數

2021-09-06 17:42:16 字數 3055 閱讀 6472

68.把陣列排成最小的數(陣列、演算法)。

題目:輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。

例如輸入陣列,則輸出這兩個能排成的最小數字 32132。

請給出解決問題的演算法,並證明該演算法。

思路:首先,肯定要考慮溢位問題。開始想用字串,後來改為了用list。思路是先把第乙個數字放入list,然後依次把後面的數字插入到合適的位置。

關鍵問題就是如何判斷兩個數字哪乙個在前面。

①對於 353 、412這樣的情況,肯定是第乙個數字小的在前面

②遇到數字相同的就比較下乙個數字

③那像 3、 32 這樣的情況,兩個數字前面相同後面不一樣長的  把長的數字去掉相同的部分再跟短的數字比 

如 3 、3332

3、332

3、32

3、2 後面的數字放前面

再如 321321321、321

321321、321

321、321 相等 哪個放在前面都一樣

為了獲取數字的每一位方便,有定義了乙個結構,存放每個數字各個位上的數,以及位數的大小。整體**如下:

/*

68.把陣列排成最小的數(陣列、演算法)。

題目:輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。

例如輸入陣列,則輸出這兩個能排成的最小數字 32132。

請給出解決問題的演算法,並證明該演算法。

start to code = 18:42

end time = 19:47

*/#include

#include

using

namespace

std;

typedef

struct

seperatenum

seperatenum;

seperatenum getseperatenum(

intn)

if (s.len == 0) //

只有乙個數字0的情況

returns;}

bool isbefore(seperatenum a, int na, seperatenum b, int nb) //

a 是否應該放在 b前面 n為當前判斷第幾個數字

else

if (b.len - nb < 0 && a.len - na >= 0) //

b數字比較短 且b與a的前面都相等

else

if(b.len - nb >= 0 && a.len - na < 0) //

a數字比較短

if (a.num[a.len - na] > b.num[b.len -nb])

else

if (a.num[a.len - na] < b.num[b.len -nb])

else

//本位數字相等判斷下一位

}void getminnum(int * in, int len) //

輸入陣列 和 長度

}if (isinsert == false) //

沒有在中間插入 插在最後面

}cout

<< "

組合成的最小數字是:";

for(it = lminnum.begin(); it != lminnum.end(); it++) //

輸出最小的數字 注意判斷結束要用 『 != 』 不能用『 < 』

}cout

<}int

main()

; getminnum(a, 4);

return0;

}

查到了乙個講c++不錯的**

整整寫了100多行,用到了自定義結構、stl、遞迴各種複雜的東西。用了1個多小時,還不包括思考的時間。

在網上找答案,發現人家的答案都好簡潔啊。

經驗證這裡的答案正確 裡面還附有證明

方法相當的簡單,我怎麼就沒有想到。 就是把兩個數a、b 正反都拼一下 ab、ba 比較一下那個數小就行了。

**裡面直接用了strcmp來做這個。

#include #include 

using

namespace

std;

const

int g_maxnumberlength=10

;char* g_strcombine1=new

char[g_maxnumberlength*2+1

];char* g_strcombine2=new

char[g_maxnumberlength*2+1

];int compare(const

void* strnumber1, const

void*strnumber2)

void printminnumber(int *numbers, int

length)

qsort(strnumbers, length,

sizeof(char*), compare);

for(int i=0; i)

cout

delete strnumbers[i];

delete strnumbers;

}void

main()

另乙個實現:

#include #include 

#include

#include

using

namespace

std;

bool compare(const

string& str1, const

string &str2)

void comarraymin(int *parray, int

num)

sort(pstrarray, pstrarray+num, compare);

for(i=0; i)

cout

}void

main()

程式設計題目 把陣列排成最小的數

68.把陣列排成最小的數 陣列 演算法 題目 輸入乙個正整數陣列,將它們連線起來排成乙個數,輸出能排出的所有數字中最小的乙個。例如輸入陣列,則輸出這兩個能排成的最小數字 32132。請給出解決問題的演算法,並證明該演算法。思路 首先,肯定要考慮溢位問題。開始想用字串,後來改為了用list。思路是先把...

題目1504 把陣列排成最小的數

題目描述 輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。輸入 輸入可能包含多個測試樣例。對於每個測試案例,輸入的第一行為乙個整數m 1 m 100 代表輸入的正整數的個數。輸入的第二行包括m...

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

輸入乙個正整數陣列,陣列裡面所有數字拼接起來排成乙個數,列印能拼接出的所有數字最小的乙個。例如輸入陣列 3,32,321 則列印出最小數字321323 const int g maxnumberlength 10 char g strcombine1 new char g maxnumberleng...