API строк Python для собеседований
Практикуйтесь с split, join, replace, find, ord/chr и форматированием строк — эти приёмы встречаются в задачах на разбор и преобразование данных
«API строк Python для собеседований» — бесплатный урок Coding Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Coding Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Coding Interview Prep содержит 4 уроков всего.
Строки в Python неизменяемы
Строки Python неизменяемы — нельзя изменить символ на месте. Любая операция над строкой, которая выглядит как её изменение, на самом деле создаёт новую строку. Поэтому выражение s[0] = 'X' вызывает TypeError. Если нужна работа на месте, сначала преобразуйте строку в список символов, выполните необходимые действия, а затем используйте ''.join(chars), чтобы собрать строку заново. Это стандартный шаблон для задач на изменение строк на собеседованиях.
s = 'hello'
# s[0] = 'H' # TypeError!
# In-place mutation pattern:
chars = list(s)
chars[0] = 'H'
result = ''.join(chars)
print(result) # 'Hello'
# Reversing a string
print(s[::-1]) # 'olleh'
print(''.join(reversed(s))) # 'olleh'split() и join(): разбор и построение
s.split(sep) разделяет строку по разделителю и возвращает список подстрок. sep=None (значение по умолчанию) разделяет строку по любым пробельным символам и отбрасывает пустые строки — это идеально подходит для разбора ввода, разделённого пробелами. 'sep'.join(iterable) объединяет строки, вставляя между ними разделитель. Конструкция ' '.join(words) — эффективный способ собрать строку с разделителями-пробелами из списка; никогда не используйте + в цикле.
# split
sentence = ' hello world '
words = sentence.split() # ['hello', 'world']
print(words)
csv = 'a,b,c,d'
parts = csv.split(',') # ['a', 'b', 'c', 'd']
print(parts)
# join
print(' '.join(words)) # 'hello world'
print(','.join(['x','y','z'])) # 'x,y,z'
# Reverse words in a sentence
print(' '.join(sentence.split()[::-1])) # 'world hello'find(), поиск по индексу и проверка принадлежности
s.find(sub) возвращает индекс первого вхождения sub или -1, если подстрока не найдена. s.index(sub) делает то же самое, но вызывает ValueError, если подстрока отсутствует; в коде на собеседовании предпочтительно использовать find, чтобы избежать необработанных исключений. Оператор принадлежности для строк выполняет поиск подстроки за O(n×m), как и find. Используйте необязательные параметры start и end, чтобы искать в срезе без его копирования.
s = 'abcabcabc'
print(s.find('bc')) # 1 (first occurrence)
print(s.find('bc', 2)) # 4 (search from index 2)
print(s.find('xyz')) # -1 (not found)
print('abc' in s) # True
# Count occurrences manually
count = 0
start = 0
while True:
idx = s.find('bc', start)
if idx == -1: break
count += 1
start = idx + 1
print(count) # 3replace(), strip() и методы работы с регистром
s.replace(old, new, count=-1) возвращает новую строку, в которой заменены все вхождения или первые count вхождений. s.strip() удаляет начальные и конечные пробельные символы или указанные символы. Методы работы с регистром lower(), upper(), capitalize() и swapcase() создают новые строки; помните, что они возвращают значения, а не изменяют строку. Нормализация регистра перед сравнением необходима в задачах, нечувствительных к регистру.
s = ' Hello, World! '
print(s.strip()) # 'Hello, World!'
print(s.strip().lower()) # 'hello, world!'
print('banana'.replace('a', 'o')) # 'bonono'
print('banana'.replace('a', 'o', 2)) # 'bonona'
# Normalise for comparison
def same_ignoring_case(a, b):
return a.lower() == b.lower()
print(same_ignoring_case('Racecar', 'racecar')) # Truestartswith(), endswith() и isalnum()
Строковые методы-предикаты возвращают логическое значение и работают за O(k), где k — длина шаблона. s.startswith(prefix) и s.endswith(suffix) принимают кортежи для указания нескольких вариантов. s.isalpha(), s.isdigit(), s.isalnum() и s.isspace() проверяют классы символов. Эти методы используются в задачах на проверку корректности палиндрома, числа и разбора URL на собеседованиях.
print('hello'.startswith('hel')) # True
print('hello'.endswith(('lo', 'la'))) # True
# isalnum for palindrome filtering
def clean(s):
return ''.join(c.lower() for c in s if c.isalnum())
print(clean('A man, a plan, a canal: Panama'))
# 'amanaplanacanalpanama'
print(clean('123abc!@#'))
# '123abc'Преобразование символов и арифметика ASCII
ord(c) возвращает кодовую точку Юникода символа c. chr(n) преобразует целое число обратно в символ. Для строчных букв выражение ord(c) - ord('a') даёт значения от 0 до 25 — это удобный способ построить массив частот фиксированного размера 26 без хеш-таблицы, который на практике быстрее для английского алфавита. Этот приём встречается в задачах на анаграммы и палиндромы.
print(ord('a')) # 97
print(ord('z')) # 122
print(chr(65)) # 'A'
# Frequency array for lowercase letters
def char_freq(s):
freq = [0] * 26
for c in s:
freq[ord(c) - ord('a')] += 1
return freq
print(char_freq('anagram')) # [3,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0]
# index 0='a'(3), 6='g'(1), 12='m'(1), 17='r'(1)Форматирование строк для вывода
На собеседованиях по программированию иногда важен аккуратный вывод. Python предлагает три стиля форматирования: форматирование с помощью % (старый стиль), .format() (классический стиль) и f-строки (современный предпочтительный стиль). F-строки наиболее удобны для чтения и поддерживают выражения напрямую: f'{value:.2f}' форматирует число с плавающей точкой с двумя знаками после запятой. Умение быстро форматировать числа, выравнивать строки и выводить таблицы сокращает время отладки в условиях нехватки времени.
name = 'Alice'
score = 95.678
# f-string (preferred in interviews)
print(f'{name}: {score:.1f}') # Alice: 95.7
print(f'{name:>10}: {score:05.1f}') # right-align
# Zero-pad an integer
print(f'{42:04d}') # 0042
# Join and format a list
nums = [1, 2, 3, 4]
print(', '.join(str(n) for n in nums)) # '1, 2, 3, 4'Эффективное построение строк с помощью join()
Конкатенация строк с помощью + в цикле создаёт новую строку на каждой итерации, поэтому для n символов общая стоимость составляет O(n²). Правильный шаблон таков: добавляйте части в список, а в конце вызовите ''.join(parts); это занимает O(n). Это один из самых распространённых антипаттернов производительности в Python. На собеседовании упоминание этого компромисса показывает, что Вы понимаете модель памяти Python.
# SLOW: O(n^2) due to repeated string allocation
def build_bad(chars):
s = ''
for c in chars:
s += c # creates a new string each time!
return s
# FAST: O(n)
def build_good(chars):
parts = []
for c in chars:
parts.append(c)
return ''.join(parts) # single allocation
# Or even more concise:
def build_best(chars):
return ''.join(chars)
print(build_best(['h','e','l','l','o'])) # 'hello'Разбор целых чисел и чисел с плавающей точкой из строк
Преобразование строк и чисел друг в друга имеет фундаментальное значение в задачах на разбор данных. int(s) и float(s) разбирают числовые строки; при недопустимом вводе они вызывают ValueError. Для более безопасного разбора используйте блок обработки исключений. Строковые методы isdigit() и isnumeric() позволяют предварительно проверить строку перед преобразованием. В задачах преобразования строки в целое число необходимо обрабатывать начальные пробелы, знаки и переполнение.
def my_atoi(s):
s = s.lstrip() # remove leading spaces
if not s: return 0
sign = 1
idx = 0
if s[0] in '-+':
sign = -1 if s[0] == '-' else 1
idx = 1
num = 0
while idx < len(s) and s[idx].isdigit():
num = num * 10 + int(s[idx])
idx += 1
result = sign * num
INT_MAX, INT_MIN = 2**31 - 1, -(2**31)
return max(INT_MIN, min(INT_MAX, result))
print(my_atoi(' -42')) # -42
print(my_atoi('4193 with words')) # 4193Срезы строк в задачах на алгоритмы
Срезы строк используются постоянно, но имеют скрытые затраты: s[i:j] создаёт новую строку длиной j-i за O(j-i) времени. Если нужно передавать подстроки в рекурсивные функции, рассмотрите передачу индексов (start, end) вместо самой подстроки, чтобы избежать затрат на выделение памяти O(n²). Эта оптимизация важна в задачах вроде поиска самой длинной палиндромной подстроки, где проверяется множество подстрок.
# Naive: O(n^3) because slicing inside nested loops
def is_palindrome_naive(s):
return s == s[::-1] # O(n) slice + O(n) compare
# Pass indices to avoid allocating substrings
def is_palindrome_range(s, left, right):
while left < right:
if s[left] != s[right]:
return False
left += 1; right -= 1
return True # O(right-left) time, O(1) space
print(is_palindrome_range('racecar', 0, 6)) # True
print(is_palindrome_range('hello', 0, 4)) # FalseКраткая памятка по строкам для собеседования
Держите в памяти эти строковые методы для собеседований:
split / join— разбор и построениеstrip / lstrip / rstrip— удаление пробельных символовlower / upper— нормализация регистраfind / index— поиск подстрокreplace— заменыisalnum / isalpha / isdigit— проверка класса символовord / chr— арифметика ASCII для задач с фиксированным алфавитомstartswith / endswith— проверка префиксов и суффиксов
# Combining methods: reverse words, preserve spaces
def reverse_words(s):
return ' '.join(reversed(s.split()))
print(reverse_words(' hello world '))
# 'world hello'
# Check anagram using sorted strings
def is_anagram(s, t):
return sorted(s) == sorted(t)
print(is_anagram('anagram', 'nagaram')) # True
print(is_anagram('rat', 'car')) # FalseБыстрая проверка
Проверьте своё понимание концепций «Структуры данных и алгоритмы — подготовка к собеседованию по программированию» из этого урока.
Итоги урока
В этом уроке Вы узнали: строки Python неизменяемы — для изменения нужно преобразовать строку в список, внести изменения, а затем снова объединить элементы, получение ASCII-кодов символов и обратное преобразование позволяют использовать массивы частот фиксированного размера 26 для задач со строчными буквами; они работают быстрее хеш-таблиц для ограниченных алфавитов, и построение строк с помощью + в цикле требует O(n²) — всегда накапливайте элементы в списке, а в конце используйте ''.join() для O(n). Далее мы рассмотрим технику скользящего окна для задач с подстроками.
Часто задаваемые вопросы
Урок «API строк Python для собеседований» бесплатный?
Да — полный текст урока «API строк Python для собеседований» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Coding Interview Prep, подпишись на CoddyKit PRO. Курс Coding Interview Prep содержит 4 уроков всего.
Чему я научусь в уроке «API строк Python для собеседований»?
Практикуйтесь с split, join, replace, find, ord/chr и форматированием строк — эти приёмы встречаются в задачах на разбор и преобразование данных Ты практикуешь Coding Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Coding Interview Prep?
Предыдущий опыт не требуется. Coding Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «API строк Python для собеседований»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Coding Interview Prep?
Да. Каждый урок Coding Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- API строк Python для собеседований
- Скользящее окно для подстрок
- Анаграммы и карты частот символов
- Кодирование строк, разворот и палиндромы