在php的面試中,算法題其實常見的就是三種,快速排序,冒泡,二分,基本上這三種可以熟練的掌握可以應付大部分的小公司面試,當然在這篇文章中我試圖收集更多的題目,以便大家進行復習
1.冒泡排序
冒泡排序即循環要從第一個值開始循環數組中的每一個值與下一個值進行比較,按照需求把大的或者小的值進行交換位置,這樣每完成一次大循環就可以把一個最大或者最小值放到數組的最後,當把所有的值循環完成後即得到一個有順序的數組
下面我們寫一個從小到大的冒泡排序
function bubble_sort($array)
{
//首先計算數組的長度
$count = count($array);
//空數組或一個值的數組無需排序直接返回即可
if ($count <= 1) {
return $array;
}
//首先通過循環拿到數組的第一個值
for ($i = 0; $i < $count; $i++) {
//用拿到的值與下一位進行比較,交換位置,直到與最後一位完成比較
for ($k = $i + 1; $k < $count; $k++) {
if ( $array[$i] > $array[$k]) {
$temp = $array[$i];
$array[$i] = $array[$k];
$array[$k] = $temp;
}
//如果是小於或者等於的情況,不需要交換位置所以不需要處理
}
}
return $array;
}
2.快速排序
從數組中選擇一個值作爲標尺, 大於這個值的放在右邊,小於這個值的放在左邊,然後左右兩個數組再遞歸調用這個方法,最後將返回的方法合併,即可得到一個有順序的數組
function quickSort($array) {
$count = count($array);
if ($count <= 1) {
return $array;
}
$left = [];
$right = [];
$compare = $array[0];//雖然取哪個值都無所謂但是爲了防止自己取不到值,所以選擇第一個;
for ($i = 1; $i < $count; $i++) {
if ($array[$i] >= $compare) {
$right[] = $array[$i];
} else {
$left[] = $array[$i];
}
}
//此時得到兩個數組,左邊都是小於標尺的,右邊都是大於標尺的,我們再次遞歸調用函數
$left = quickSort($left);
$right= quickSort($right);
//最後將左邊,標尺,右邊進行合併,即可
return array_merge($left,array($compare),$right);
}
3.二分查找
二分查找只能對已經排序完成的數組進行查找,
以一個從大到小排列的數組爲例,每次從數組的中間位置取值與要比較的數組進行比較,如果大於該值,說明要找的值在左邊,相反則在右邊,如果相等則返回該值的key
function searchKey($array, $search) {
$count = count($array);
$start = 0;
$end = count($array) - 1;
while($start <= $end) {
//取中間值
$mid = floor(($end + $start)/2);
if ($saerch == $array[$mid]){
return $mid;
} elseif ($search > $array[$mid]) {
$end = $mid - 1;
} else {
$start = $mid + 1;
}
}
return '查找的值不在數組中';
}
4.猴子選大王
一羣猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就叫做大王。要求編程模擬此過程,輸入m、n, 輸出最後那個大王的編號。
function chooseKing($m, $n){
//生成一個數組 array('1','2','3','4',.....'n');
$mokeys = range(1,$n);
//設置標尺
$i = 0;
while (count($mokeys)>1) {
/*
//對m進行取餘 如果值爲0則說明可以正好數到m,則從數組中剔出
if ($i%$m = 0) {
unset($mokeys[$i]);
} else {
//如果不是這隻猴子,把他的編號塞進數組的末尾,並把當前位置捨去,繼續參與接下來的計算
array_push($mokeys,$mokeys[$i]);
unset($mokeys[$i]);
}
//由上代碼我們可以知道不管是否是這隻猴子都會有一個unset的操作,我們可以將代碼化簡入戲
*/
if (($i + 1)%$m != 0) {
array_push($mokeys,$mokeys[$i]);
}
unset($mokeys[$i]);
$i ++;
}
return current($mokeys);
}
5.母牛生小牛
有一母牛,到4歲可生育,每年一頭,所生均是一樣的母牛,到15歲絕育,不再能生,20歲死亡,問n年後有多少頭牛。
function niu($y){
$num = 1;
for ($i = 0; $i < $y; $i++) {
if ($i > 4 && $i < 15) {
$num ++ ;
niu($y - $i);
} elseif ($i == 20) {
$num --;
}
}
return $num;
}
6.遍歷一個文件下的所有文件和子文件夾下的文件
function readFiles($dir) {
$files = [];
//拿到句柄
if(@$handle = opendir($dir)) {
//打開文件夾
while(($file = readdir($handle)) !== false) {
//排除上級及當前目錄
if($file != ".." && $file != ".") {
//如果是子文件夾,進行遞歸
if(is_dir($dir . "/" . $file)) {
$files[$file] = readFiles($dir . "/" . $file);
} else {
//如果是文件放到數組中
$files[] = $file;
}
}
}
closedir($handle);
}
return $files;
}