面试题(程序02)

  1. 给定一个数组,将数组中元素向右移动k个位置,k是非负数。例如:[1,2,3,4,5,6] 和 k=2 。输出:[5,6,1,2,3,4]要求使用空间复杂度O(1)的原地算法。
    //***旋转数组*** rorate=>旋转
    $arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
    function rorate(array $arr,$k)
    {
        $len = count($arr);
        if($k>=$len){
            //$k%$len,那就只需要移动余数次即可
            $k = $k % $len;
        }
    
        $tmp = array_slice($arr,-$k);
        // print_r($arr);
        // print_r($tmp);
        //还要把截取的那一段删除
        for($i=$len-$k;$i<$len;$i++){
            unset($arr[$i]);
        }
        //再把截取的数字插入到数组开头
        // array_unshift($arr,$tmp);//这样是吧数组插入开头了
        for($j=$k-1;$j>=0;--$j){
            array_unshift($arr,$tmp[$j]);
        }//两个for循环可以放到一起
        print_r($arr);
        
    }
    rorate($arr,4);
    
    //把两个for循环放在一起
    for($i=$k-1;$i>=0;$i--){
        array_pop($arr);
        array_unshift($arr, $tmp[$i]);
    }
    View Code
  2. 模仿百度搜索框:
     1 html代码:
     2 <!DOCTYPE html>
     3 <html>
     4 <head>
     5     <meta charset="utf-8">
     6     <title>百度搜索</title>
     7     <script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
     8 </head>
     9 <body>
    10     <form action="" method="" enctype="multipart/form-data">
    11         <input type="text" name="search" placeholder="输入...">
    12         <input type="submit" value="搜索"><br/>
    13         <div class="list">
    14             <ul>
    15                 
    16             </ul>
    17         </div>
    18     </form>
    19 </body>
    20 <script type="text/javascript">
    21     var search = $('input[name="search"]');
    22     var list = $('.list>ul');
    23     search.keyup(function(){
    24         var cont = search.val();
    25         $.ajax({
    26             type: 'post',
    27             data: {cont: cont},
    28             dataType: 'json',
    29             url: './test.php',
    30             success: function(res) {
    31                 if(res.status){
    32                     list.find('li').remove();
    33                     $.each(res.result, function(index, item){
    34                         list.append('<li>'+item+'</li>');
    35                     })
    36                 }else{
    37                     list.html('<li>'+res.result+'</li>');
    38                 }
    39             },
    40             error: function(res) {
    41                 console.log(res);
    42             },
    43         })
    44     })
    45 </script>
    46 </html>
    47 
    48 PHP代码:
    49 $arr  = ['里', '那里昂多', '里昂', '里那多', '外面', '外太空', '挖行人'];
    50 if($_POST['cont'] == ''){
    51     $data = ['status'=>0, 'result'=>'data is empty'];
    52     echo json_encode($data);
    53 }else{
    54     $pattern = "/".$_POST['cont']."+/";
    55     $r = preg_grep($pattern, $arr);
    56     if($r){
    57         $res = $r;
    58     }else{
    59         $res = array('暂无数据');
    60     }    
    61     $data = ['status'=>1, 'result'=>$res];
    62     echo json_encode($data);
    63 }
    View Code

//不知道空间复杂度为1 是什么情况。但是如果说不考虑空间复杂度的话,我想到的方法是:1.从数组末尾截取k个数字,然后插入到开头。
// 2.for循环k次,从末尾弹出一个数字放在开头

  1. /*如下数组是学生成绩,用PHP处理使其按照score倒序排序*/
    $arr = array(
    array('name'=>'A','score'=>60),
    array('name'=>'B','score'=>90),
    array('name'=>'C','score'=>85),
    );
    思路:现将这个二维数组进行遍历,把score单独存到一个新的数组score中,下标和原来的一一对应。然后使用arsort()对score数组排序(保留健名),然后主要就是利用这个健名的顺序对原二维数组进行排序,使用array_keys()获取排序后的健名存到keys数组中。对keys数组遍历,keys数组中的值就是二维数组按需求排序后的下标。所以把原来数组中的值按照键名的顺序依次取出来重新插入数组中即可。(二维数组中即便有其他的值也没问题)

    //遍历此数组,key和val一一对应,比较val['score']大小同时,记住对应的key值。最后按照val['score']排序的时候,就用key找对应的name。
    function score_sort(array $arr) {
        //默认是二维数组
        if(count($arr)<=1){
            return ;
        }
        //定义一个数组用来存放val['score']的值
        $score = [];
        foreach($arr as $key => $val){
            $score[$key] = $val['score']; //成绩对应的下标就是原数组对应的下标
            //然后我的想法就是对score数组进行排序,并且是保留健名的排序。这样就还可以找到score中值在原数组中位置,不会找不到而出错
        }
        arsort($score); //保留健名的倒序排序
        print_r($score);
        //然后获取score数组的健名(*顺序不能变*),将原来的数组按照这个健名排序即可。
        $keys = array_keys($score);
        print_r($keys);
        echo'<br><pre>';
        //这里我想到的方法是最笨的方法,没有想到更好的处理方式-_-#
        //就是把原来数组中的值按照键名的顺序依次取出来重新插入数组中
        $newarr = [];
        for($i=0;$i<count($keys);++$i){
            $index = $keys[$i];
            $newarr[] = $arr[$index];
        }
        return $newarr;
    }
    
    print_r(score_sort($arr));
    View Code

    $arr = array(
    array('name'=>'A','score'=>60,'ddd'=>66),
    array('name'=>'B','score'=>90,'ccc'=>77),
    array('name'=>'C','score'=>85,'eee'=>88),
    array('name'=>'C','score'=>84,'eee'=>88),
    array('name'=>'C','score'=>58,'eee'=>88),
    );

  2. 有一段文字:"我司有电信AD、AC(已取消)、2018央采AF、WOC等车产品" ,取出这段描述中的英文AD,AC,AF,WOC
    /*"我司有电信AD、AC(已取消)、2018央采AF、WOC等车产品" 取出这段描述中的英文AD,AC,AF,WOC*/
    $str = "我司有电信AD、AC(已取消)、2018央采AF、WOC等车产品";
    $pattern = "/[a-zA-Z]+/";
    //$pattern = "/[a-zA-Z]*/";
    $arr = preg_match_all($pattern,$str,$match);
    print_r($match[0]);
    
    //这里有一点要注意,正则表达式要用  +  ,千万不要用  *  。因为*匹配0,1,多次,导致返回结果会有很多空值。使用+就是至少有一个英文才会匹配。
    View Code
  3. 一串数字,1,3,6,10,15,21,28,36,45······请用递归计算第三十个数字是多少
    //addend=>加数,counter=>计数器
    function number($num=1,$addend=2) {
        static $counter = 1;//counter记录当前$num是第几个数字
        $num += $addend;
        $addend++;//加数递增
        $counter++;//每计算一次,计数器加1 当counter == 30的时候结束
        if($counter < 30){
            $num = number($num,$addend);//要用一个变量来接收函数返回值才行,而且这里必须用num接收。
            //因为最后一次计算,不会执行if分支,直接返回计算结果num,num返回到函数调用处。如果不用变量接收函数返回值,那么num最终返回的就是第一次计算的结果。为什么选择用num接收,因为要用最后一次函数返回值覆盖之前每一次计算的num值,这样得到的结果才是正确的。不然的话返回的将是第一次计算的结果num=3。
        }
        return $num;
    }
    
    echo number();
    View Code

     想要得到第几个数字都可以,直接调用的时候传一个参数即可。如下:

    //addend=>加数,counter=>计数器
    function number($k,$num=1,$addend=2) {
        static $counter = 1;//counter记录当前$num是第几个数字
        $num += $addend;
        $addend++;//加数递增
        $counter++;//每计算一次,计数器加1 当counter == 30的时候结束
        if($counter < $k){
            $num = number($k,$num,$addend);//要用一个变量来接收函数返回值才行,而且这里必须用num接收。
            //因为最后一次计算,不会执行if分支,直接返回计算结果num,num返回到函数调用处。如果不用变量接收函数返回值,那么num最终返回的就是第一次计算的结果。为什么选择用num接收,因为要用最后一次函数返回值覆盖之前每一次计算的num值,这样得到的结果才是正确的。不然的话返回的将是第一次计算的结果num=3。
        }
        return $num;
    }
    
    echo number(30);
    View Code
  4. sql 类型题(wamp下student数据库):


  5. select a.grade,b.name,a.name,c.score,max(score) as maxscore from a,b,c where a.id=c.stu_id and b.id=c.subject_id group by a.grade,b.name ;

    第一题答案,但是名字还没有对应,查询出来的名字不是最高分对应的学生名。用到了三表联查。。还有就是group by后面可以接多个字段,第一次使用。而且group by 后面字段之间使用逗号和使用and是不一样的。使用逗号是(怎么说呢,就拿本题来说吧)按年级和科目分组,一年级,二年级·····然后一年级里还有语文、数学········结果如下图

     第二题:要按照stu_id分组,不能按照学生姓名分组,因为学生姓名会有重复的,要统计所有学生的分数,并且不可以去重。

    select a.grade,a.class,a.name,max(score) as maxscore,min(score) as minscore,avg(score) as avgscore from a,c where a.id=c.stu_id group by c.stu_id;

    第三题:按年级分组,每个年级中排名第一的班级(所有学生的所有科目平均分排名第一)

    select a.grade,a.class,avg(score) from a,c where a.id=c.stu_id group by a.grade,a.class;

    先计算出每个年级中的每个班级平均分(如上SQL),在从结果中筛选出平均分最大的那个班级。

    select grade,class,max(avgscore) as maxscore2 from(select a.grade,a.class,avg(score) as avgscore from a,c where a.id=c.stu_id group by a.grade,a.class) as s group by grade ;

    这里用到了嵌套查询(效率低,不得已而用,没想到其他方法),还有注意一点,就是from后面的子句要起别名,否则会报错:Every derived table must have its own alias 。意思是:每个派生表都必须有自己的别名。这里起了一个别名s。

原文地址:https://www.cnblogs.com/bneglect/p/10986845.html