PHP算法面试知识点
在 PHP 面试中,虽然 PHP 主要用于 Web 开发,但许多公司仍会考察算法和数据结构,以测试候选人的逻辑思维能力和编程能力。以下是 PHP 面试中常考的 算法知识点 及其示例代码:
1. 数组与字符串
(1)数组去重
考点:array_unique()、哈希表去重
function removeDuplicates($arr) {
return array_values(array_unique($arr));
}
print_r(removeDuplicates([1, 2, 2, 3, 4, 4, 5]));
如果只是去重,array_unique就可以了,但是array_unique会导致数值数组变关联数组,会导致json_encode由数组变对象。所以使用array_values的目的是对去重后的数组重新索引
(2)求数组的最大/最小值
考点:max()、min()、遍历
function findMax($arr) {
$max = $arr[0];
foreach ($arr as $num) {
if ($num > $max) $max = $num;
}
return $max;
}
echo findMax([10, 3, 5, 8, 2]);
(3)数组元素出现次数
考点:哈希表(array_count_values())
function countOccurrences($arr) {
return array_count_values($arr);
}
print_r(countOccurrences([1, 2, 2, 3, 3, 3, 4]));
(4)反转字符串
考点:strrev()、双指针法
function reverseString($str) {
return strrev($str);
}
echo reverseString("hello");
(5)判断回文字符串
考点:双指针、strrev()
function isPalindrome($str) {
return $str === strrev($str);
}
echo isPalindrome("racecar") ? "Yes" : "No";
2. 排序算法
(6)冒泡排序
考点:双循环遍历,交换相邻元素
function bubbleSort($arr) {
$n = count($arr);
for ($i = 0; $i < $n - 1; $i++) {
for ($j = 0; $j < $n - 1 - $i; $j++) {
if ($arr[$j] > $arr[$j + 1]) {
[$arr[$j], $arr[$j + 1]] = [$arr[$j + 1], $arr[$j]];
}
}
}
return $arr;
}
print_r(bubbleSort([5, 2, 9, 1, 5, 6]));
(7)快速排序
考点:递归、分治
function quickSort($arr) {
if (count($arr) < 2) return $arr;
$pivot = $arr[0];
$left = array_filter(array_slice($arr, 1), fn($x) => $x <= $pivot);
$right = array_filter(array_slice($arr, 1), fn($x) => $x > $pivot);
return array_merge(quickSort($left), [$pivot], quickSort($right));
}
print_r(quickSort([10, 3, 8, 15, 6, 1]));
3. 查找算法
(8)二分查找
考点:递归、while 迭代
function binarySearch($arr, $target) {
$left = 0;
$right = count($arr) - 1;
while ($left <= $right) {
$mid = floor(($left + $right) / 2);
if ($arr[$mid] === $target) return $mid;
if ($arr[$mid] < $target) $left = $mid + 1;
else $right = $mid - 1;
}
return -1;
}
echo binarySearch([1, 3, 5, 7, 9, 11], 5);
4. 栈与队列
(9)括号匹配
考点:栈(array_push()、array_pop())
function isValidParentheses($s) {
$stack = [];
$map = [')' => '(', '}' => '{', ']' => '['];
for ($i = 0; $i < strlen($s); $i++) {
if (in_array($s[$i], $map)) {
if (empty($stack) || array_pop($stack) !== $map[$s[$i]]) return false;
} else {
array_push($stack, $s[$i]);
}
}
return empty($stack);
}
echo isValidParentheses("({[]})") ? "Valid" : "Invalid";
5. 递归与回溯
(10)斐波那契数列
考点:递归、动态规划(记忆化)
function fibonacci($n, &$memo = []) {
if ($n <= 1) return $n;
if (isset($memo[$n])) return $memo[$n];
return $memo[$n] = fibonacci($n - 1, $memo) + fibonacci($n - 2, $memo);
}
echo fibonacci(10);
(11)全排列
考点:回溯算法
function permute($nums, $used = [], $path = [], &$res = []) {
if (count($path) == count($nums)) {
$res[] = $path;
return;
}
for ($i = 0; $i < count($nums); $i++) {
if (in_array($i, $used)) continue;
permute($nums, [...$used, $i], [...$path, $nums[$i]], $res);
}
}
$result = [];
permute([1, 2, 3], [], [], $result);
print_r($result);
6. 位运算
(12)判断一个数是否是 2 的幂
考点:n & (n - 1) == 0
function isPowerOfTwo($n) {
return $n > 0 && ($n & ($n - 1)) == 0;
}
echo isPowerOfTwo(8) ? "Yes" : "No";
男儿走四方,何处不为家
死在哪里,葬在哪里,天下青山一样

浙公网安备 33010602011771号