每个程序员半小时内必须解决的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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值