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、訊息推送的實現(非記憶)
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)交給從資料庫來處理,資料庫複製,就是把事務性操作導致的變更 同步到叢集中的從資料庫(主從複製)。
②讀寫分離原因:寫操作的速度相對讀操作要慢,耗費時間長,解決資料庫寫操作影響讀操作的問題