PHP задачи на LeetCode: как решать и что изучить

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

PHP на LeetCode: неожиданный, но мощный союзник в подготовке к собеседованию

Когда слышишь «LeetCode», в голове обычно всплывают Java, Python или C++. PHP в этом списке кажется аутсайдером. Но если вы пишете на PHP и хотите расти — от простого «скриптовщика» до инженера, который проектирует высоконагруженные системы, — вам обязательно нужно пройти через LeetCode на PHP.

Почему? Потому что LeetCode — это не про синтаксис. Это про алгоритмическое мышление. А PHP, при всей своей веб-специфике, даёт вам ровно те же инструменты для работы с массивами, строками, деревьями и графами. Только с немного другим синтаксисом и некоторыми «подводными камнями».

В этой статье мы разберём, какие темы нужно подтянуть, как писать эффективный код на PHP для LeetCode, и покажем реальные примеры решений. Поехали!

Почему PHP-разработчику нужен LeetCode?

Многие думают: «Я бэкенд-разработчик на PHP, мне достаточно знать Laravel и SQL». Это ловушка. На собеседованиях в крупные компании (и не только) вам дадут задачу на бинарный поиск или динамическое программирование. И если вы не умеете решать такие задачи на PHP, вас не возьмут, даже если вы гуру Symfony.

LeetCode тренирует:

  • Умение анализировать сложность алгоритмов (Big O). Без этого вы не сможете оптимизировать запросы или писать эффективные очереди.
  • Работу с нестандартными структурами данных — стеки, очереди, хеш-таблицы, деревья. В PHP они не так очевидны, как в Java.
  • Чистоту кода — вы учитесь писать короткие, понятные функции без лишних костылей.

И да, PHP на LeetCode — это не ссылка на документацию. Это полноценный язык для решений. Главное — знать его особенности.

Что нужно изучить перед стартом?

1. Массивы — главный инструмент PHP

В PHP нет классических списков или хеш-таблиц — всё это массивы. Они могут быть и индексированными, и ассоциативными. Это мощно, но и опасно: можно случайно смешать типы ключей.

Что важно:

  • array_map(), array_filter(), array_reduce() — ваши лучшие друзья.
  • Сортировка: sort(), asort(), ksort(). Помните, что sort() сбрасывает ключи.
  • Проверка существования ключа: isset() и array_key_exists() — не одно и то же.

2. Строки и регулярки

PHP славится функциями работы со строками. На LeetCode часто встречаются задачи на палиндромы, анаграммы, подсчёт символов. Используйте str_split(), count_chars(), preg_match() (но не злоупотребляйте — на собеседовании могут попросить без регулярок).

3. Рекурсия и стек

В PHP нет встроенного стека (SplStack — есть, но редко используется). Чаще всего стек эмулируют массивом с array_push() и array_pop(). Рекурсия тоже работает, но следите за глубиной — по умолчанию лимит 256 вызовов.

4. Классы и объекты

LeetCode часто даёт задачи, где нужно реализовать класс (стек, очередь, LRU-кэш). В PHP это делается через классы с private/protected свойствами. Не забывайте про __construct() и типизацию.

Типичные задачи на LeetCode для PHP

Давайте разберём три популярные задачи — от простой к средней сложности. Код будет на PHP, с пояснениями.

Задача 1: Two Sum (Лёгкая)

Условие: Дан массив чисел и целевая сумма. Найти индексы двух чисел, которые в сумме дают target.

Решение через хеш-таблицу (ассоциативный массив):

function twoSum(array $nums, int $target): array {
    $map = []; // ключ — число, значение — индекс
    
    foreach ($nums as $i => $num) {
        $complement = $target - $num;
        
        if (isset($map[$complement])) {
            return [$map[$complement], $i];
        }
        
        $map[$num] = $i;
    }
    
    return [];
}

// Пример:
print_r(twoSum([2, 7, 11, 15], 9)); // [0, 1]

Почему это работает? Мы проходим массив один раз, сохраняя каждый элемент в хеш-таблицу. Для каждого числа проверяем, есть ли уже его «комплемент». Сложность O(n), память O(n).

Важно для PHP: Используем isset(), а не array_key_exists(), потому что isset() быстрее. Но помните: если значение может быть null, используйте array_key_exists().

Задача 2: Valid Parentheses (Лёгкая)

Условие: Проверить, правильно ли расставлены скобки: (), {}, [].

Решение через стек:

function isValid(string $s): bool {
    $stack = [];
    $pairs = [
        ')' => '(',
        '}' => '{',
        ']' => '[',
    ];
    
    for ($i = 0; $i < strlen($s); $i++) {
        $char = $s[$i];
        
        if (isset($pairs[$char])) {
            // Закрывающая скобка
            $top = array_pop($stack) ?? '#';
            if ($top !== $pairs[$char]) {
                return false;
            }
        } else {
            // Открывающая скобка
            array_push($stack, $char);
        }
    }
    
    return empty($stack);
}

// Пример:
var_dump(isValid("()[]{}")); // true
var_dump(isValid("(]"));     // false

Разбор: Стек идеально подходит для проверки парности. Каждую открывающую скобку кладём в стек, при встрече закрывающей — достаём и сравниваем. Если стек пуст или не совпало — ошибка.

Особенность PHP: array_pop() возвращает null для пустого массива. Чтобы избежать ошибки, используем ?? '#' — это даст заведомо неверное значение.

Задача 3: Binary Tree Inorder Traversal (Средняя)

Условие: Дано бинарное дерево. Вернуть массив значений узлов в порядке inorder (левый, корень, правый).

Рекурсив

Блоги

Рекомендаций по книгам