使用二分法查找數組中某元素的位置(應該是排好序的)
<?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)交給從數據庫來處理,數據庫複製,就是把事務性操作導致的變更 同步到集羣中的從數據庫(主從複製)。
②讀寫分離原因:寫操作的速度相對讀操作要慢,耗費時間長,解決數據庫寫操作影響讀操作的問題