前言
PHP是世界上最好的語言,一度認為演算法對於PHPer是多餘的存在,而往往面試來講也有略微的考察,相信大家在大多數面試情況下都會被要求寫氣泡排序,然而也有部分PHPer連氣泡排序都寫半天(比如我)
一般面試以下幾種演算法足以應對!!!如有錯誤請評論修訂,謝謝!
已完成
- 斐波那契數列
- 掃描資料夾
- 二分查詢
- 氣泡排序
- 快速排序
- LeetCode第一題
TODO
- 堆排序
- 選擇排序
- 連結串列翻轉
- 動態規劃
<?php
class Algorithmic {
/***
* 斐波那契數遞迴法,f(n) = f(n-1) + f(n-2) 遞迴層級太多,呼叫棧爆滿,100層
*/
function fib($n) {
if ($n < 2) {
return 1;
} else {
return $this->fib($n - 1) + $this->fib($n - 2);
}
}
/***
* 使用陣列儲存每一個fib(n)的數值,空間複雜度增加
* @param $dir
* @return array
*/
function fib2($n) {
if ($n < 2) {
return 1;
} else {
$arr = [1, 1];
for ($i = 2; $i <= $n; $i++) {
$arr[$i] = $arr[$i - 1] + $arr[$i - 2];
}
}
return $arr[$n];
}
/***
* 使用兩個臨時變數儲存前兩個值fib(n)的數值,空間複雜度增加比陣列降低
* @param $dir
* @return array
*/
function fib3($n) {
if ($n < 2) {
return 1;
} else {
$last = 1; //等式第二項
$lastLast = 1; //等式第一項
for ($i = 2; $i <= $n; $i++) {
$current = $last + $lastLast;
$lastLast = $last;
$last = $current;
}
return $current;
}
}
/***
* 掃描檔案目錄
* @param $dir
* @return array
*/
function scanFile($dir) {
$fileList = [];
if (is_dir($dir)) {
$dh = opendir($dir);
while ($file = readdir($dh)) {
if ($file == '.' || $file == '..') continue; //linux下一切皆檔案
$newDir = $dir . '/' . $file;
if (is_dir($newDir)) {
$fileList[][$file] = $this->scanFile($newDir);
} else {
$fileList[] = $file;
}
}
closedir($dh);
}
return $fileList;
}
/***
* 二分查詢
*/
function binarySort($arr, $target) {
if (!is_array($arr) || count($arr) < 2) {
return $arr;
}
$len = count($arr);
$start = 0;
$end = $len - 1;
while ($start <= $end) {
$middle = floor(($start + $end) / 2) ;
if ($arr[$middle] == $target) {
return $middle;
} elseif ($arr[$middle] < $target) {
$start = $middle + 1;
} else {
$end = $middle - 1;
}
}
return false;
}
/***
* 氣泡排序
*/
function bubbleSort($arr) {
for ($i = count($arr) - 1; $i > 0; $i--) {
for ($j = 0; $j < $i; $j++) {
if ($arr[$j+1] < $arr[$j]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
/***
* 快排序
*/
function quickSort($arr) {
if (!is_array($arr) || count($arr) < 2) {
return $arr;
}
$base = $arr[0];
$left = [];
$right = [];
for ($i = 1; $i <= count($arr) - 1; $i++) {
if ($arr[$i] < $base) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
return array_merge(array_merge($this->quickSort($left),[$base]), $this->quickSort($right));
}
/***
* 兩數之和, LeetCode第一題
* @param $arr
*/
function twoSum($arr, $sum = 8){
$tempArr = [];
foreach ($arr as $k => $v) {
if (isset($tempArr[$v])) {
return [$k, $tempArr[$v]];
}
$tempArr[$sum-$v] = $k;
}
return [];
}
}
$algorithmic = new Algorithmic();
//var_dump($algorithmic->scanFile("./"));
//var_dump($algorithmic->twoSum([4,5,3,4,5,67,787]));
//var_dump($algorithmic->fib3(4)); // 1 1 2 3 5
//var_dump($algorithmic->binarySort([1,3, 4, 5,7,9], 3)); //
var_dump($algorithmic->quickSort([14,5,13,114,4,3,167,87,14]));
本作品採用《CC 協議》,轉載必須註明作者和本文連結