每個程序員半小時內必須解決的5個編程問題——php實現

問題4

編寫一個能將給定非負整數列表中的數字排列成最大數字的函數。例如,給定[50,2,1,9],最大數字爲95021。

解決方式1

主要思路爲將數組按每個數的第一個數字大小進行倒序排序,然後按順序進行字符串拼接

function question4(){
    $arr= [50,2,1,9];
    $tmp = [];
    for($i = 0; $i < count($arr); $i++){
        $tmp[$i] = substr($arr[$i],0,1);  //[5,2,1,9]
    }
    arsort($tmp); //[3=>9,0=>5,1=>2,2=>1]
    $re = '';
    foreach($tmp as $k=>$v){
        $re .= $arr[$k];
    }
    var_dump($re);
}

問題5

編寫一個在1,2,…,9(順序不能變)數字之間插入+或-或什麼都不插入,使得計算結果總是100的程序,並輸出所有的可能性。例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。

解決方式1

public function question5(){
    $arr = range(1,9);        //生成1~9的數組
    $symbol = ['+','-',''];   //定義運算符
    $result = 100;            //目標結果
    te3($arr, '',$result, $symbol);
}

/*
 * 遞歸,窮舉所有的可能性,並將滿足條件的運算式輸出
 * @param array  $arr      [使用的數組]
 * @param string $formula  [根據$arr和運算符拼接的運算式]
 * @param int    $result   [目標結果]
 * @param array  $divisors [運算符集合]
 */
function te3($arr, $formula, $result, $divisors=['+'.'-','']){
    //每次遞歸會將$arr中的第一個元素取出並刪除
    //如果$arr的長度爲1,表示只剩最後一個數,遞歸結束
    if(count($arr) == 1){
        $formula .= $arr[0];
        if(te3_cal($formula, $result)){
            echo $formula .'<br>';
        }
    }else{
        //每次遞歸將$arr的第一個元素拼接到運算式中,然後將該元素刪除
        $formula .= $arr[0];
        array_shift($arr);

        //遍歷所有運算符,每拼接一個數字,就遍歷該情況下的所有可能
        //並將每一種可能都進行一次遞歸
        foreach($divisors as $divisor){
            te3($arr, $formula.$divisor, $result, $divisors);
        }
    }
}

/*
 * 計算運算式,並得出其與目標結果的比較結果,也可以使用eval函數
 * @param string $formula [運算式,例:"1-2+34+5-67+89"]
 * @param int    $result  [目標結果]
 */
function te3_cal($formula,$result){
//    $formula = '1-2-34+5-6+78+9'; //51
//    $formula = '12+3-45+6+78-9';    //45
    $temp = explode('-',$formula);  // 按-號分割運算式
    $re = 0;        //保存運算結果
    $count = 0;     //運算次數
    $count_j = 0;   //+法運算次數
    foreach($temp as $v){
        //如果是數字,就進行計算,否則以+號進行分割
        if(is_numeric($v)){
            //如果未進行過運算,那麼就是第一個數,第一個數無符號
            if($count == 0){
                $re = $v;
            }else {   //如果不是第一個數,則進行減法運算
                $re -= $v;
            }
        }else{
            $add_tmp = explode('+',$v);
            foreach($add_tmp as $vv){
                if(is_numeric($vv)){
                    if($count == 0){
                        $re = $vv;
                        $count ++;
                    }else {
                        if ($count_j == 0) {
                            $re -= $vv;
                        } else {
                            $re += $vv;
                        }
                    }
                    $count_j++;
                }
            }
            $count_j = 0;
        }
        $count++;
    }
    if($re == $result){  //判斷運算結果與目標結果是否相同
        return true;
    }else{
        return false;
    }
}
發佈了73 篇原創文章 · 獲贊 22 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章