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";
posted @ 2025-03-31 17:39  传VV说  阅读(10)  评论(0)    收藏  举报