解題筆記(25) 把陣列排成最小的數

2021-09-01 03:56:07 字數 1585 閱讀 9520

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

思路:先將整數陣列轉為字串陣列,然後字串陣列進行排序,最後依次輸出字串陣列即可。這裡注意的是字串的比較函式需要重新定義,不是比較a和b,而是比較ab與 ba。如果ab < ba,則a < b;如果ab > ba,則a > b;如果ab = ba,則a = b。

比較函式的定義是本解決方案的關鍵。

證明:為什麼這樣排個序就可以了呢?簡單證明一下。根據演算法,如果a < b,那麼a排在b前面,否則

b排在a前面。

可利用反證法,假設排成的最小數字為******,並且至少存在一對字串滿足這個關係:a > b,但是在組成的數字中a排在b前面。根據a和b出現的位置,分三種情況考慮:

(1)***xab,

用ba代替ab可以得到***xba,這個數字是小於***xab,與假設矛盾。因此排成的最小數字中,不存在上述假設的關係。

(2)ab***x,

用ba代替ab可以得到ba***x,這個數字是小於ab***x,與假設矛盾。因此排成的最小數字中,不存在上述假設的關係。

(3)a***xb,這一步證明麻煩了一點。

可以將中間部分看成乙個整體ayb,則有

ay < ya,yb < by成立。將ay和by表示成10進製數字形式,則有下述關係式,這裡a,y,b的位數分別為n,m,k。

關係1:ay < ya => a * 10^m + y < y * 10^n + a => a * 10^m - a < y * 10^n - y => a( 10^m - 1)/( 10^n - 1) < y

關係2:yb < by => y * 10^k + b < b * 10^m + y => y * 10^k - y < b * 10^m - b => y < b( 10^m -1)/( 10^k -1)

關係3:a( 10^m - 1)/( 10^n - 1) < y < b( 10^m -1)/( 10^k -1) =>a/( 10^n - 1)< b/( 10^k -1) => a*10^k - a < b * 10^n - b =>a*10^k + b < b * 10^n + a => a < b

這與假設a > b矛盾。因此排成的最小數字中,不存在上述假設的關係。

綜上所述,得出假設不成立,從而得出結論:對於排成的最小數字,不存在

滿足下述關係的一對

字串:a > b,但是在組成的數字中a出現在b的前面。從而得出演算法是正確的。

[cpp]view plain

copy

print?

//重新定義比較函式物件

structcompare

};//函式功能:把陣列排成最小的數

//函式引數:parray為陣列,num為陣列元素個數

//返回值:無

voidcomarraymin(int*parray,intnum)

sort(pstrarray,pstrarray+num,compare());//字串陣列排序

for(i=0;i//列印字串陣列

cout}

把陣列排成最小的數解題報告

輸入乙個正整數陣列,把陣列裡所有數字拼接起來排成乙個數,列印能拼接出的所有數字中最小的乙個。例如輸入陣列,則列印出這三個數字能排成的最小數字為321323。第乙個偷懶方法,新建乙個class重新定義比較函式,然後利用這個class和python自帶的sort排序 class new def init...

把陣列排成最小的數

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

把陣列排成最小的數

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