《演算法之美》 n個數連線得到最小的多位整數

2021-08-25 09:30:05 字數 1328 閱讀 7994

題目:設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?

例如:n=2時,2個整數32,321連線成的最小整數是:32132;

n=4時,4個整數55,31,312,33連線成的最小整數為:312313355。

解答:由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此我們將之轉換為字串之間的連線更簡單些,同時自定義字串的比較規則:如果字串a+b > b+a,那麼a>b

。同時可以證明a+b>=b+a,b+c>=c+b,則a+c>=c+a。

因此,解題思路為:1)先將輸入的n個整數轉換成字串;2)按照自定義的字串比較規則將n個字串排序;3)最後按照從小到大的順序輸出字串,即實現連線成最小的整數。

**如下:

#include

#include

#include

class

ascenum

//過載'<'操作符

bool

operator

<(

const

ascenum &other)

const

//下面就是我們的自定義字串比較規則額

std::string right = str + other.str;

std::string left = other.str + str; if

(right >= left)

//相等時算是false

return

false;

else

if(right < left)

return

true;

} const

char

* getstr()

const

private:

std::string str; };

void

asceout(

int*target,

intlen)

//按順序輸出,就可以實現組成乙個最小的多位數

//如果反向輸出則是乙個最大的多位數

for(std::set::iterator it = ascestrings.begin(); it != ascestrings.end(); it++)

std::cout< }

intmain() ;

inttestcase2 = ;

asceout(testcase1, 3);

asceout(testcase2, 6);

system(

"pause");

return

0; }

《演算法之美》 n個數連線得到最小的多位整數

題目 設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?例如 n 2時,2個整數32,321連線成的最小整數是 32132 n 4時,4個整數55,31,312,33連線成的最小整數為 312313355。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...

貪心演算法 n個數連線得到最小或最大的多位整數

設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。例如 n 3時,3個整數13,312,343,連成的最大整數為 34331213 又如 n 4時,4個整數7,13,4,246連線成的最大整數為7424613 輸入 n n個數輸出 連線成的多位數 演算法分析 此題很容易想到使用貪心法,在考試...

字串排序 n個數連線得到最小或最大的多位整數

描述 設有n個正整數,將它們依次連成在一排,組成乙個多位數,現在要求可能組成的多位數中最大的多位數是什麼?例如 n 3時,3個整數13,312,343連成的最大多位數為 343 312 13。例如 n 4時,4個證書7,13,4,246連成的最大多位數為 7 4 246 13。輸入 n個整數,eof...