Строковые мини-задачи: разворот, анаграммы, палиндром
Разбираем мини-задачи про строки, которые почти гарантированно дадут на интервью.
Главная идея: в Python большинство строковых задач решается срезами и встроенными функциями в одну-две строки — знать эти идиомы важнее, чем писать циклы вручную.
Задача 1: перевернуть строку
Чёткий ответ. Срез s[::-1] с шагом -1 переворачивает любую последовательность. Это идиоматичнее и быстрее цикла.
s = "Привет"
print(s[::-1])
# почему работает: [начало:конец:шаг], шаг -1 идёт с конца
print("abcde"[::-1])
Вывод:
тевирП edcba
Задача 2: проверить анаграмму
Две строки — анаграммы, если состоят из одних и тех же букв. Достаточно сравнить отсортированные версии или счётчики символов.
def is_anagram(a, b):
return sorted(a) == sorted(b)
print(is_anagram("listen", "silent"))
print(is_anagram("hello", "world"))
# вариант через Counter — O(n) вместо O(n log n)
from collections import Counter
def is_anagram_fast(a, b):
return Counter(a) == Counter(b)
print(is_anagram_fast("table", "bleat"))
Вывод:
True False True
Сортировка даёт O(n log n), а сравнение Counter — O(n). На интервью стоит упомянуть оба и пояснить разницу в сложности.
Задача 3: палиндром
Палиндром читается одинаково с обеих сторон. Сравниваем строку с её разворотом — снова срез [::-1].
def is_palindrome(s):
s = s.lower().replace(" ", "")
return s == s[::-1]
print(is_palindrome("Аргентина манит негра"))
print(is_palindrome("привет"))
Вывод:
True False
Задача 4: первый неповторяющийся символ
Ещё одна классика: найти первый символ, который встречается ровно один раз. Наивное решение перебирало бы для каждого символа всю строку (O(n²)). Правильный приём — за один проход посчитать все частоты через Counter, а потом пройти строку и вернуть первый символ с частотой 1. Получается O(n).
from collections import Counter
def first_unique(s):
counts = Counter(s) # один проход: частоты всех символов
for ch in s: # второй проход: ищем первый уникальный
if counts[ch] == 1:
return ch
return None
print(first_unique("swiss"))
print(first_unique("aabbcc"))
Вывод:
w None
Здесь важно объяснить интервьюеру именно сложность: два линейных прохода вместо вложенного цикла. Это типичный пример, где знание Counter превращает O(n²) в O(n).
Итог
- Разворот:
s[::-1]— срез с шагом −1. - Анаграмма:
sorted(a) == sorted(b)(O(n log n)) илиCounter(a) == Counter(b)(O(n)). - Палиндром: сравнение строки с её разворотом после нормализации.
- Первый уникальный символ: два прохода с
CounterдаютO(n)вместоO(n²).