ENIGMA AI
ENIGMA AI

Дана строка из латинских букв. Нужно найти первый символ, который встречается в строке ровно один раз. Расскажите, как бы вы это решали и какова временная и пространственная сложность вашего решения?

встречается 3× junior algorithms

Как ответить

Оптимальное решение — два прохода по строке. Сначала подсчитываем количество вхождений каждого символа в массив фиксированного размера (например, int[26] для строчных латинских букв). Затем проходим строку второй раз и возвращаем первый символ, у которого счётчик равен единице. Временная сложность — O(n), пространственная — O(1) (26 целых чисел).

Если строка может содержать заглавные латинские буквы — расширяем массив до 52. Для любого ограниченного алфавита такой массив эффективнее хеш-таблицы — нет накладных расходов на хеширование и разрешение коллизий.

Пример реализации на Java:

public char firstUniqueChar(String s) {
    if (s == null || s.isEmpty()) {
        return '\0'; // или выбросить исключение
    }
    int[] freq = new int[26];
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c >= 'a' && c <= 'z') {
            freq[c - 'a']++;
        }
        // если нужна поддержка заглавных — добавить else if
    }
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if (c >= 'a' && c <= 'z' && freq[c - 'a'] == 1) {
            return c;
        }
    }
    return '\0'; // нет уникальных
}

Граничные случаи обрабатываем явно: пустая строка — возвращаем нулевой символ (или индикатор отсутствия). Если все символы встречаются более одного раза — то же самое.

Альтернатива — LinkedHashMap для подсчёта за один проход (при обновлении счётчика потом пройти по карте). Но это даёт O(n) по времени и O(k) по памяти, где k — количество уникальных символов (до 26). Профита в простоте нет, а памяти — больше. Массив проще и быстрее на практике.

Ключевые тезисы

  • Два прохода: подсчёт частоты в массиве фиксированного размера, затем поиск первого с freq = 1.
  • Временная сложность O(n), пространственная — O(1) для ограниченного алфавита (латиница — 26 или 52).
  • Массив int[26] предпочтительнее хеш-таблицы — меньше накладных расходов.
  • Обязательно обработать краевые случаи: пустая строка, отсутствие уникальных символов.
  • Альтернативы (LinkedHashMap) проигрывают по памяти и не дают выигрыша во времени.

Что спросят дальше

  • — Если бы строка была очень большой (миллиарды символов) и не помещалась в память, как бы вы решили задачу?
  • — А если символы — Unicode с суррогатными парами? Как изменится структура для подсчёта?
  • — Можно ли найти первый уникальный символ за один проход, используя битовые маски (два бита на символ: 00 — не встречался, 01 — встретился один раз, 11 — больше)? Обсудите ограничения.

Готовьтесь к собеседованию с ENIGMA AI

AI-суфлёр подсказывает ответы прямо на собеседовании в реальном времени — незаметно для интервьюера.

Скачать приложение