问题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;
}
}