輸入一個正整數(shù)數(shù)組,把數(shù)組里所有數(shù)字拼接起來排成一個數(shù),打印能拼接出的所有數(shù)字中最小的一個。例如輸入數(shù)組{3,32,321},則打印出這三個數(shù)字能排成的最小數(shù)字為321323。
要求打印出最小的排列順序,最簡單粗暴的方式就是利用字符串排列那樣將所有的情況全部遍歷出來,然后在比較大小。但是事件會非常非常長,占用的空間非常大,所以應(yīng)該放棄。題目的實(shí)質(zhì)對數(shù)組的排序。排序的方法不是關(guān)鍵,關(guān)鍵的是規(guī)則。之前曾經(jīng)比較的規(guī)則考慮的復(fù)雜化,自認(rèn)為對兩個元素進(jìn)行每一位比較,而且不簡單的時字符串大小比較,總是沒有通過。后來恍然大悟,我可以將兩個數(shù)進(jìn)行排列,得到兩種情況,對這兩種情況得到的新數(shù)進(jìn)行比較大小就可以判斷如何排列組合能夠使得兩個數(shù)拼接得到的第三個數(shù)最小,從而制定排序規(guī)則。代碼如下:
function PrintMinNumber($numbers)
{
// write code here
for($i=0;$i<count($numbers);$i++){
for($j=0;$j<count($numbers)-1-$i;$j++){
if(rule($numbers[$j],$numbers[$j+1])){
$t = $numbers[$j];
$numbers[$j] = $numbers[$j+1];
$numbers[$j+1] = $t;
}
}
}
return implode("",$numbers);
}
function rule($one,$other){
$one = "$one";
$other = "$other";
$a = $one.$other;
$b = $other.$one;
return $a > $b;
}