問題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;
}
}