把陣列中的數拼接起來,求最大值(最小值)
阿新 • • 發佈:2019-02-11
問題分析
- 最暴力的解法就是把所有的組合都找出來, 然後排序得到最大值(或者最小值),這樣還搞什麼演算法,直接拋棄.
- 這個問題的思路為: 在一個數組中依次選出最合適的值放在結果中. 那麼問題就變成了如何選出最合適的值, 下面以求最大值為例說明:
- 對於兩個數比較, 首先要考慮的就是位數的差異, 比如 9和 10 從值的大小比較, 那應該是10勝出, 但是 109 肯定沒有 910大. 所以比較的時候要把位數作為判斷的依據.
- 考慮了位數之後, 我們就來比較數字的大小:位數相同的, 數值大 的作為最合適的值 , 例如 9和8比較, 9勝出;
- 位數不同的, 以位數少的為基準, 從左到右逐位 比較. 位值大的勝出, 例如: 9和88比較, 9勝出; 位值相同的, 位數少的勝出,例如: 99和990比較, 99勝出.
- 這樣下來每次選擇的都是 最合適的值 ,依次組合的結果也就是我們想要的最大值.
下面是程式碼 php
function get_max($arr)
{
$res = ''; // 最後的結果
while (count($arr) > 0) {
$max = '0'; // 存放每次選擇最大值, 初始化
$del = ''; // 存放最大值對應的陣列鍵位, 選出最大值後從陣列中刪除
foreach ($arr as $key => $value) {
$str = (string)$value ;
$min = min($max, $value); // 選出兩者較小的, 作為判斷位數
for ($i=0, $len=strlen($min); $i < $len ; $i++) {
// echo "len = $len || str = $str || max = $max || value = $value || str[$i] > max[$i] = $str[$i] > $max[$i] <br/>"; // 這個把比較輸出更直觀
// 兩個逐位判斷的條件
if ( $str[$i] > $max[$i] || ($str[$i] == $max[$i] && $min == $value && $i == $len -1) ){
$max = (string)$value;
$del = $key;
break;
} else if ( $str[$i] < $max[$i] ){
// 如果當前數字小於最大值的, 說明這個不需要再比較了
break;
}
}
}
// 在結果中追加本次選出的最合適的值, 兩個數加個橫杆更直觀
$res .= $max . "-";
// 把選出的最大值刪除
unset($arr[$del]);
}
return $res;
}
測試下
$arr = [23,1,34,55,22,11,44,66,84,8,99,982,918,9];
print_r(get_max($arr));
結果是
9-99-982-918-8-84-66-55-44-34-23-22-1-11-