【长期更新】 PHP题目

2024-08-16 09:44:05 浏览数 (2)

1.要求在一组数中,插入一个新数,并维护原来的排序方式不变

代码语言:javascript复制
<?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.用二分法在一个数组中查找你所需元素(针对数字数组,返回值为下标)

代码语言:javascript复制
<?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.打印杨辉三角

代码语言:javascript复制
1
1  1
1  2  1
1  3  3   1
1  4  6   4  1
1  5 10  10  5  1

4.冒泡排序(统计一维数组)

代码语言:javascript复制
<?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.快速排序算法

代码语言:javascript复制
<?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.选择排序

代码语言:javascript复制
<?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只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目。

代码语言:javascript复制
<?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.小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小 猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?

代码语言:javascript复制
<?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美分的硬币,写一个算法让售货员用最少的硬币个数找给小孩

代码语言:javascript复制
<?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.五只猴子采得一堆桃子,猴子彼此约定隔天早起后再分食。不过,就在半夜里,一只猴子偷偷起来,把桃子均分成五堆后,发现还多一个,它吃掉这桃子,并拿走了 其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆。第三只,第四只,第五只猴子都依次如此分食桃子。 那么桃子数最少应该有几个呢?

代码语言:javascript复制
<?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等语句)

代码语言:javascript复制
<?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);//二零一九年一月一六日

0 人点赞