2020年PHP 面試問題(一)


1.get,post 的區別

1、GET在瀏覽器回退時是無害的,而POST會再次提交請求。
2、GET產生的URL地址可以被Bookmark,而POST不可以。
3、GET請求會被瀏覽器主動cache,而POST不會,除非手動設置。
4、GET請求只能進行url編碼,而POST支持多種編碼方式。
5、GET請求參數會被完整保留在瀏覽器歷史記錄里,而POST中的參數不會被保留。
6、GET請求在URL中傳送的參數是有長度限制的,而POST沒有。
7、對參數的數據類型,GET只接受ASCII字符,而POST沒有限制。
8、GET比POST更不安全,因為參數直接暴露在URL上,所以不能用來傳遞敏感信息。
9、GET參數通過URL傳遞,POST放在Request body中。
10、GET產生一個TCP數據包,POST產生兩個TCP數據包

 

2.require,include 區別

require是無條件包含也就是如果一個流程里加入require,無論條件成立與否都會先執行require include有返回值,而require沒有(可能因為如此require的速度比include快) 包含文件不存在或者語法錯誤的時候require是致命的錯誤終止執行,include不是

3.PHP 的垃圾回收機制

PHP 可以自動進行內存管理,清除不需要的對象。

PHP 使用了引用計數 (reference counting) GC 機制。

每個對象都內含一個引用計數器 refcount,每個 reference 連接到對象,計數器加 1。當 reference 離開生存空間或被設為 NULL,計數器減 1。當某個對象的引用計數器為零時,PHP 知道你將不再需要使用這個對象,釋放其所占的內存空間。

4.常見的排序算法

1. 冒泡排序

思路分析:在要排序的一組數中,對當前還未排好的序列,從前往后對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即,每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換。

代碼實現:

$arr=array(1,43,54,62,21,66,32,78,36,76,39);  
function bubbleSort($arr)
{  
  $len=count($arr);
  //該層循環控制 需要冒泡的輪數
  for($i=0;$i<$len-1;$i++)
  { //該層循環用來控制每輪 冒出一個數 需要比較的次數
    for($k=0;$k<$len-$i-1;$k++)
    {
       if($arr[$k]>$arr[$k+1])
        {
            $tmp=$arr[$k+1];
            $arr[$k+1]=$arr[$k];
            $arr[$k]=$tmp;
        }
    }
  }
  return $arr;
}

  

2. 選擇排序
思路分析:在要排序的一組數中,選出最小的一個數與第一個位置的數交換。然后在剩下的數當中再找最小的與第二個位置的數交換,如此循環到倒數第二個數和最后一個數比較為止。

代碼實現:

function selectSort($arr) {
//雙重循環完成,外層控制輪數,內層控制比較次數
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假設最小的值的位置
        $p = $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;
}

  

3.插入排序
思路分析:在要排序的一組數中,假設前面的數已經是排好順序的,現在要把第n個數插到前面的有序數中,使得這n個數也是排好順序的。如此反復循環,直到全部排好順序。

代碼實現:

function insertSort($arr) {
    $len=count($arr); 
    for($i=1, $i<$len; $i++) {
        $tmp = $arr[$i];
        //內層循環控制,比較並插入
        for($j=$i-1;$j>=0;$j--) {
            if($tmp < $arr[$j]) {
                //發現插入的元素要小,交換位置,將后邊的元素與前面的元素互換
                $arr[$j+1] = $arr[$j];
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移動的元素,由於是已經排序好是數組,則前面的就不需要再次比較了。
                break;
            }
        }
    }
    return $arr;
}

  

 

4.快速排序

思路分析:選擇一個基准元素,通常選擇第一個元素或者最后一個元素。通過一趟掃描,將待排序列分成兩部分,一部分比基准元素小,一部分大於等於基准元素。此時基准元素在其排好序后的正確位置,然后再用同樣的方法遞歸地排序划分的兩部分。

 

 

代碼實現:

function quickSort($arr) {
    //先判斷是否需要繼續進行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //選擇第一個元素作為基准
    $base_num = $arr[0];
    //遍歷除了標尺外的所有元素,按照大小關系放入兩個數組內
    //初始化兩個數組
    $left_array = array();  //小於基准的
    $right_array = array();  //大於基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左邊數組
            $left_array[] = $arr[$i];
        } else {
            //放入右邊
            $right_array[] = $arr[$i];
        }
    }
    //再分別對左邊和右邊的數組進行相同的排序處理方式遞歸調用這個函數
    $left_array = quick_sort($left_array);
    $right_array = quick_sort($right_array);
    //合並
    return array_merge($left_array, array($base_num), $right_array);
}

  

5、給出一個字符串,返回里面連續字母的個數,比如:abbcddde,返回 1a2b1c3de;
代碼實現:

 public function str($str)
    {
        $re = '';
        $arr = str_split($str);//把字符串變成數組,開始我想到的是用for循環來處理,這個函數同事提醒了才發現
        $key = 0; //key 用來記錄下標,為了方便計算前面的數字
        for ($i = 0; $i < count($arr); $i++) {
            $v = $arr[$i];
            if ($arr[$i] == $arr[$i + 1]) {
                continue;//如果當前的值和下一個值相等,跳出當前循環,進入下一個
            } else {
                $re  .= ($i - $key + 1) . $v; //不相等時計算出前面的數字,
                $key = $i + 1;// 同時 key 下標重新復制
            }
        }

        return $re;
    }

  

6、約瑟夫環問題,猴子選大王

一群猴子排成一圈,按1,2,…,n依次編號。然后從第1只開始數,數到第m只,把它踢出圈,從它后面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最后只剩下一只猴子為止,那只猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最后那個大王的編號。用程序模擬該過程。

unction mk($n ,$m){
        $arr = range(1,$n);//構造一個數組
        $i = 1; //從第一個開始循環
        while(count($arr)>1){ //如果總數大於1
            ($i % $m != 0) && array_push($arr,$arr[$i-1]);//不被踢出則壓入數組尾部
            unset($arr[$i-1]);//壓入數組然后刪除
            $i++;//繼續循環
        }  
        return $arr[$i-1]; //直至最后剩下一個為大王 
}
print_r(mk(6,8));   //第3只為大王

  

更多學習內容請訪問:

騰訊T3-T4標准精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個台階(持續更新)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM