每个程序员半小时内必须解决的5个编程问题——php实现

来源:互联网 发布:gta5男角色捏脸数据 编辑:程序博客网 时间:2024/06/13 07:31

问题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;    }}
阅读全文
0 0
原创粉丝点击