0Pricing
DSA Interview Prep · Урок

API строк Python для собеседований

Практикуйтесь с split, join, replace, find, ord/chr и форматированием строк — эти приёмы встречаются в задачах на разбор и преобразование данных

«API строк Python для собеседований» — бесплатный урок DSA Interview Prep на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DSA Interview Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DSA 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)  # 3

replace(), 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'))  # True

startswith(), 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) и разблокировать остальной курс DSA Interview Prep, подпишись на CoddyKit PRO. Курс DSA Interview Prep содержит 4 уроков всего.

Чему я научусь в уроке «API строк Python для собеседований»?

Практикуйтесь с split, join, replace, find, ord/chr и форматированием строк — эти приёмы встречаются в задачах на разбор и преобразование данных Ты практикуешь DSA Interview Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать DSA Interview Prep?

Предыдущий опыт не требуется. DSA Interview Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «API строк Python для собеседований»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке DSA Interview Prep?

Да. Каждый урок DSA Interview Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. API строк Python для собеседований
  2. Скользящее окно для подстрок
  3. Анаграммы и карты частот символов
  4. Кодирование строк, разворот и палиндромы
← Назад к DSA Interview Prep