1. 程式人生 > >把陣列中的數拼接起來,求最大值(最小值)

把陣列中的數拼接起來,求最大值(最小值)

問題分析

  • 最暴力的解法就是把所有的組合都找出來, 然後排序得到最大值(或者最小值),這樣還搞什麼演算法,直接拋棄.
  • 這個問題的思路為: 在一個數組中依次選出最合適的值放在結果中. 那麼問題就變成了如何選出最合適的值, 下面以求最大值為例說明:
    1. 對於兩個數比較, 首先要考慮的就是位數的差異, 比如 9和 10 從值的大小比較, 那應該是10勝出, 但是 109 肯定沒有 910大. 所以比較的時候要把位數作為判斷的依據.
    2. 考慮了位數之後, 我們就來比較數字的大小:位數相同的, 數值大 的作為最合適的值 , 例如 9和8比較, 9勝出;
    3. 位數不同的, 以位數少的為基準, 從左到右逐位 比較. 位值大的勝出, 例如: 9和88比較, 9勝出; 位值相同的, 位數少的勝出,例如: 99和990比較, 99勝出.
    4. 這樣下來每次選擇的都是 最合適的值 ,依次組合的結果也就是我們想要的最大值.

下面是程式碼 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-