php面經

使用二分法查找數組中某元素的位置(應該是排好序的)

<?php
function Search($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;
}
?>

 

php遞歸求一個數的階乘

<?php
 
       function demo($a)
       {
           if($a > 1)
	   {
	      $r=$a*demo($a-1);
	   }else
	   {
	      $r=$a;
	   }
 
	   return $r;
       }
       
       $a=6;
       echo $a."的階乘的值".demo($a);
?>

 用兩個棧(先進後出)實現一個隊列(先進先出):完成隊列的Push和Pop操作(添加刪除最後一個元素)

兩個棧。出棧的時候,如果棧2不爲空,就出棧2。如果棧2爲空,就把棧1的出棧再入棧2。

<?php
$arr1 = array();
$arr2 = array();

    function mypush($node)
    {

        array_push($arr1,$node);
    }
    function mypop()
    {
        if(!empty($arr2)){
            return array_pop($arr2);
        }else{
            while(!empty($arr1)){
                array_push($arr2, array_pop($arr1));
            }
            return array_pop($arr2);
        }
    }

1、求一個數組中第二大的元素。

<?php
// 求一個數組中第二大的元素 
function getSecond($arr)
{
	$max = 0;
	$second = 0;
	$count = count($arr);
	if ($count == 0) {
		return false;
	}
	for ($i=0; $i < $count; $i++) { 
		if ($arr[$i] > $max) {
			$second = $max;
			$max = $arr[$i];

		}elseif ($arr[$i] < $max && $arr[$i] > $second) {
			$second = $arr[$i];
		}
	}

	return $second;
}

$arr = [3,5,3,7,4,1,33,65,23,2,45];
print_r(getSecond($arr));

2、數組中一個數組出現次數超過數組長度一半,如果說字符串中某字符,可運用函數轉換爲數組str_split(string,int),按照幾個字符分割,默認一個字符。

<?php 
// 數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。
/**
 * 方法1:採用用戶“分形葉”思路(注意到目標數 超過數組長度的一半,對數組同時去掉兩個不同的數字,到最後剩下的一個數就是該數字。如果剩下兩個,那麼這兩個也是一樣的,就是結果),在其基礎上把最後剩下的一個數字或者兩個回到原來數組中,將數組遍歷一遍統計一下數字出現次數進行最終判斷。
 * 方法2:數組排序後,如果符合條件的數存在,則一定是數組中間那個數。(快排O(nlogn))
 * 方法3:如果有符合條件的數字,則它出現的次數比其他所有數字出現的次數和還要多。
 * 在遍歷數組時保存兩個值:一是數組中一個數字,一是次數。遍歷下一個數字時,若它與之前保存的數字相同,則次數加1,否則次數減1;若次數爲0,則保存下一個數字,並將次數置爲1。遍歷結束後,所保存的數字即爲所求。然後再判斷它是否符合條件即可。
 * 方法3最優
 */
function MoreSum($arr)
{
	$count = count($arr);
	if ($count == 0) {
		return 0;
	}
	// 定義次數變量$temp, $num
	$temp = 0;
	$num = $arr[0];

	for ($i=0; $i < $count; $i++) { 
		if ($num == $arr[$i]) {
			$temp++;

		}else {
			$temp--;
		}
		if ($temp == 0) {
			$num = $arr[$i];
			$temp = 1;
		}
	}
	$check = check($num,$arr);
	if (!$check) {
		return 0;
	}
	return $num;
}
// 校驗函數
function check($num,$arr)
{	
	$count = count($arr);
	$tem = 0;  //計次函數
	for ($i=0; $i < $count; $i++) { 
		if ($arr[$i] == $num) {
			$tem++;
		}
	}
	if ($tem <= $count/2) {
		return false;
	}
	return true;
}

// $arr = [1,2,3,2,2,2,5,4,2];
$arr = [1,2,3,2,4,2,5,2,3];
$res = MoreSum($arr);
print_r($res);
 ?>

3、列出一個字符串的所有排列組合形式。

 

4、比較兩個字符串,其中一個的排列組合中的某種是否在另一個字符串中存在。   

      思路:分爲兩個數組,循環一個數組中的元素,如果另一個數組中有相同的就劃掉,如果出現不同,則恢復另一個數組,重新進行比較。

5、索引失效的情況?聯合查詢時只有沒有第一個條件,有其他條件

     聯合查詢的使用union

6、數據庫:查找數組中某一個時間段內最大或最小的某個字段   between and

7、刪除數組中某個指定的元素,(可以通過key-value交換函數)

<?php
$arr1 = array(1,3, 5,7,8);
$key = array_search(3, $arr1);
if ($key !== false)
    array_splice($arr1, $key, 1);
var_dump($arr1);

//結果索引改變  0 1 2 ……
<?php
$arr2 = array(1,3, 5,7,8);
foreach ($arr2 as $key=>$value)
{
    if ($value === 3)
        unset($arr2[$key]);
}
var_dump($arr2);
?>

//結果 索引未改變   0 2 3 ……

8、堆排序實現代碼

9、冒泡排序實現代碼

10、快排實現代碼

11、laravel框架的理解

12、thinkphp框架聯合的使用 concat

13、字符串查找函數(包括中文查找函數)

        strpos

14、404、500、204、301

15、控制器的類型

16、Linux配置多域名

17、產生0-1000的隨機整數,如果某個數字大於500,輸出這個數字。

 

18、99個數字從1到100中不重複取,求缺失的數字。

        答:分別求和,然後求差

19、tcp udp

       tcp面向連接,udp是無連接的  詳解

20、序列化與反序列化

       序列化:將對象的狀態信息轉換爲可以存儲或傳輸的字節序列形式的過程。

       反序列化:把字節序列恢復爲對象的過程。

21、分區分表

22、消息推送的實現(非記憶)

建立長連接 APP  web

23、hash

 

24、一個不平衡的二叉樹,只顯示最右邊的數據

 

25、mqtt的工作原理

       解:消息隊列遙測傳輸協議,是一種基於發佈/訂閱(publish/subscribe)模式的“輕量級”通訊協議,該協議基於TCP/IP協議構建。mqtt理解

26、對於支付過程中會發生的突發情況,怎麼解決?

       解:若回調過程中,處理業務失敗(如更新訂單狀態失敗),返回<return_code><![CDATA[FAIL]]></return_code>時,微信會繼續發起回調。即使繼續回調,在此過程中業務處理失敗的問題未得到處理,待微信多次回調結束後,當前訂單仍然是“待付款”狀態,但用戶的錢已經支付了,假設“待付款”的訂單無法發貨,這樣的情況該如何準確處理呢?

              P.S.個人認爲準確的情況,應該是在回調過程中發生異常處理失敗返回FAIL的時候,微信(或我的程序)調用退款接口,將用戶支付金額返回到賬戶,但這樣也有兩點問題:
1、調用退款接口之後,針對原支付成功的回調,該如何返回?返回FAIL無法終止回調,返回SUCCESS,又感覺不符合場景。
2、調用退款接口,微信端同樣會針對這個退款進行回調,如果這個退款的回調再發生異常失敗,又如何處理?

27、數據庫讀寫分離的理解

       ①讀寫分離就是將事務性的寫操作(update/insert/delete)交給主數據庫來處理,讀操作(select)交給從數據庫來處理,數據庫複製,就是把事務性操作導致的變更  同步到集羣中的從數據庫(主從複製)。

       ②讀寫分離原因:寫操作的速度相對讀操作要慢,耗費時間長,解決數據庫寫操作影響讀操作的問題

       詳解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章