1.要求在一组数中,插入一个新数,并维护原来的排序方式不变
<?php //1.要求在一组数中,插入一个新数,并维护原来的排序方式不变 function insertArr($arr,$val){ $pos=0; if (sizeof($arr)==0) return array($val); //传入数组没有值 if (sizeof($arr)==1){ //传入数组个数为1 return array($val,$arr[0]); } //分清排序 $bfind=false; if ($arr[0]>$arr[sizeof($arr) - 1]){ $bfind=true; //从大到小排序 }else{ $bfind=false;//从小到大排序 } for($i=0;$i<sizeof($arr);$i++){ //找到要插入值应该插入的位置。 if ($bfind){ if ($arr[$i]<$val){ $pos=$i; break; } }else{ if ($arr[$i]>$val){ $pos=$i; break; } } } $left_arr=array(); $right_arr=array(); for ($i=0;$i<sizeof($arr);$i++){ //根据要插入的值把数组分左右两部分。 if ($i<$pos){ $left_arr[]=$arr[$i]; }else{ $right_arr[]=$arr[$i]; } } return array_merge($left_arr,array($val),$right_arr); } //测试 $arr=array(); var_dump(insertArr($arr,10));echo "<br>"; $arr=array(1); var_dump(insertArr($arr,10));echo "<br>"; $arr=array(1,2,5,9,13,15); var_dump(insertArr($arr,10));echo "<br>"; $arr=array(40,15,12,9,8,1); var_dump(insertArr($arr,10));echo "<br>"; ?>
2.用二分法在一个数组中查找你所需元素(针对数字数组,返回值为下标)
<?php //二分法 function binarySearch($a, $val){ $low = 0; $high= count($a) - 1; while($low <= $high){ $mid = intval(($low+$high)/2); if($a[$mid] == $val) return $mid; //找到相等的就返回所在的位置 if($a[$mid] > $val){ //要查找的在前半截 $high = $mid - 1; }else{ $low = $mid + 1; //要查找的在后半截 } } return -1; } //测试 $arr=array(1,2,6,8,10); echo binarySearch($arr,6); ?>
3.打印杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
//规律
//第一行和第二行均为1
//从第三行开始,第一个和最后一个为1
//第二个位置的值为上一行的前一个位置的值和本位置正上方的值的和。
<?php function generationYanghui($num){ $arr=array(); for ($i=0;$i<$num;$i++){ $arr[$i]=array(); //第一行和第二行均为1 if ($i==0){ $arr[$i][0]=1; continue; } if ($i==1){ $arr[$i][0]=1; $arr[$i][1]=1; continue; }
//第三行的2等于第二行的第一个1加第一个1
for ($j=0;$j<=$i;$j++){ if ($j==0){ $arr[$i][$j]=1; continue; } if ($j==$i){ $arr[$i][$j]=1; continue; } $arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j]; } } return $arr; } //测试 $num=6; $arrYH = generationYanghui($num); for ($i=0;$i<sizeof($arrYH);$i++){ for($j=0;$j<sizeof($arrYH[$i]);$j++){ echo $arrYH[$i][$j] . " " ; } echo "<Br>"; } ?>
4.冒泡排序(统计一维数组)
<?php //冒泡排序(一维数组) function bubble_sort($arr){ //统计数组中个数 $count = count($arr); if ($count <= 0) return false; for($i=0; $i<$count; $i++){ for($j=$count-1; $j>$i; $j--){ if ($arr[$j] < $arr[$j-1]){ $tmp = $arr[$j]; $arr[$j] = $arr[$j-1]; $arr[$j-1] = $tmp; } } } return $arr; } //测试 $_array = array('5', '8' ,'5' ,'6' ,'9' ,'3' ,'2' ,'4'); $_array = bubble_sort($_array); var_dump($_array); ?>
5.快速排序算法
<?php function quick_sort($arr){ if(count($arr)<=1){ return $arr; } $key=$arr[0]; $left_arr=array(); $right_arr=array(); for($i=1;$i<count($arr);$i++){ if($arr[$i]<=$key){ $left_arr[]=$arr[$i]; }else{ $right_arr[]=$arr[$i]; } } $left_arr=quick_sort($left_arr); $right_arr=quick_sort($right_arr); return array_merge($left_arr,array($key),$right_arr); } //使用实例 $_array = array('6', '8' ,'7' ,'6' ,'9' ,'2' ,'2' ,'4'); $_array = quick_sort($_array); var_dump($_array); ?>
7.选择排序
<?php function select_sort($arr) { //实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数 //$i 当前最小值的位置, 需要参与比较的元素 for($i=0, $len=count($arr); $i<$len-1; $i++) { //先假设最小的值的位置 $p = $i; //$j 当前都需要和哪些元素比较,$i 后边的。 for($j=$i+1; $j<$len; $j++) { //$arr[$p] 是 当前已知的最小值 if($arr[$p] > $arr[$j]) { //比较,发现更小的,记录下最小值的位置;并且在下次比较时, // 应该采用已知的最小值进行比较。 $p = $j; } } //已经确定了当前的最小值的位置,保存到$p中。 //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可 if($p != $i) { $tmp = $arr[$p]; $arr[$p] = $arr[$i]; $arr[$i] = $tmp; } } //返回最终结果 return $arr; } $arr = [1,2,0,4,5,6]; $data = select_sort($arr); var_dump($data);
8.公鸡3元每只,母鸡5元每只,小鸡1元3只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目。
<?php $totalmoney=100; $totalchicken=100; $cocknum = intval($totalmoney/3); //全买公鸡的数目 $hennum = intval($totalmoney/5); //全买母鸡的数目 $biddynum = 100; //小鸡数为100 for ($i=1;$i<$cocknum;$i++){ //公鸡数 for ($j=1;$j<$hennum;$j++){//母鸡数 for ($k=1;$k<$biddynum;$k++){//小鸡数 $money = $i * 3 + $j * 5 + $k / 3; $total = $i + $j + $k; if (($money == $totalmoney) &&($total == $totalchicken)){ echo "公鸡:" . $i . "只,母鸡:" . $j ."只,小鸡:" . $k ."只<Br>"; } } } } ?>
9.小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小 猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?
<?php //倒推算法。 function getTotal($day){ $total=0; if ($day==1){ //第一天为一个 $total = 1; }else{ //以后每一天为前一天的两个加上一个。 $total = 2*(getTotal($day-1)+1); } return $total; } //测试 echo getTotal(10); ?>
10.一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币个数找给小孩。假设提供了数目不限的面值为2 5美分、1 0美 分、5美分、及1美分的硬币,写一个算法让售货员用最少的硬币个数找给小孩
<?php $totalmoney=100; //总钱数(美分) $consumemoney=11; //花去的钱 $complet=false; //找钱完成 $change=0; //找零25,10,5,1美分钱的个数 $ch25 = 0; $ch10 = 0; $ch5 = 0; $ch1 = 0; for(;;){ if ($complet) break; $left=$totalmoney - $consumemoney - $change; //还没有找的钱 if ($left <= 0) { $complet = true; }else{ if ($left >= 25){ //找25美分钱 $change = $change + 25; $ch25 = $ch25 + 1; }else if ($left >= 10 ){//找10美分钱 $change = $change + 10; $ch10 = $ch10 + 1; }else if ($left >= 5){//找5美分钱 $change = $change + 5; $ch5 = $ch5 + 1; }else{//找1美分钱 $change = $change + 1; $ch1 = $ch1 + 1; } } } echo "剩余零钱 " . ($totalmoney - $consumemoney) . " 美分<br>"; echo "找25美分 " . $ch25 . " 个<br>"; echo "找10美分 " . $ch10 . " 个<br>"; echo "找 5美分 " . $ch5 . " 个<br>"; echo "找 1美分 " . $ch1 . " 个<br>"; ?>
11.五只猴子采得一堆桃子,猴子彼此约定隔天早起后再分食。不过,就在半夜里,一只猴子偷偷起来,把桃子均分成五堆后,发现还多一个,它吃掉这桃子,并拿走了 其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆。第三只,第四只,第五只猴子都依次如此分食桃子。 那么桃子数最少应该有几个呢?
<?php echo "start"; for ($y=16;;$y+=4){ if (($y-1)%5!=0) continue; $x=$y; for ($i=4;$i>=1&&$x%4==0;$i--){ $x=($x/4)*5+1; } if ($i==0){ echo "桃子最少应该有:" . $x; break; } } ?>
12.请使用一句话将类似“1910-09-09”的日期各式转换为“一九一零年九月九日”这样的各式。(需要有通用性,是不是一句话不是关键,但不允许使用 ifswitchwhilefor等语句)
<?php function changeDate($str) { //去除符号'-' $pattern='/(d+)-(0*)([1-9]+)-(0*)([1-9]+)/'; $replace='${1}年${3}月${5}日'; $str= preg_replace($pattern, $replace, $str); //替换数字 $patterns=array("/0/","/1/","/2/","/3/","/4/","/5/","/6/","/7/","/8/","/9/"); $replaces=array("零","一","二","三","四","五","六","七","八","九"); $re = preg_replace($patterns, $replaces, $str); return $re; } $str = '2019-01-16'; echo changeDate($str);//二零一九年一月一六日