0Pricing
Coding Interview Prep · Lekcja

Python String API na rozmowach rekrutacyjnych

Przećwiczą Państwo split, join, replace, find, ord/chr oraz wzorce formatowania ciągów występujące w zadaniach rekrutacyjnych dotyczących analizowania i przekształcania tekstu.

Python String API na rozmowach rekrutacyjnych to bezpłatna lekcja Coding Interview Prep na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Coding Interview Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Napisy w Pythonie są niezmienne

Napisy w Pythonie są niezmienne — nie można zmienić pojedynczego znaku w miejscu. Każda operacja na napisie, która pozornie go modyfikuje, w rzeczywistości tworzy nowy napis. Oznacza to, że s[0] = 'X' powoduje zgłoszenie wyjątku TypeError. Gdy potrzebna jest modyfikacja w miejscu, należy najpierw przekonwertować napis na listę znaków, wykonać operacje, a następnie użyć ''.join(chars) do odtworzenia napisu. Jest to standardowy wzorzec stosowany w zadaniach rekrutacyjnych dotyczących modyfikowania napisów.

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() i join(): analizowanie i budowanie

s.split(sep) dzieli napis według separatora i zwraca listę podnapisów. sep=None (wartość domyślna) dzieli napis według dowolnych białych znaków i pomija puste napisy — idealnie nadaje się do analizowania danych wejściowych rozdzielonych spacjami. 'sep'.join(iterable) łączy napisy, umieszczając między nimi separator. Wyrażenie ' '.join(words) to wydajny sposób tworzenia napisu rozdzielonego spacjami z listy — nie należy używać + w pętli.

# 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(), index() i in

s.find(sub) zwraca indeks pierwszego wystąpienia sub albo -1, jeśli nie znaleziono podnapisu. s.index(sub) działa tak samo, ale zgłasza ValueError, jeśli podnapis nie występuje — w kodzie rekrutacyjnym warto preferować find, aby uniknąć nieobsłużonych wyjątków. Operator in dla napisów wykonuje wyszukiwanie podnapisu w czasie O(n×m), tak samo jak find. Opcjonalne parametry start i end pozwalają wyszukiwać w obrębie wycinka bez jego kopiowania.

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() i metody zmiany wielkości liter

s.replace(old, new, count=-1) zwraca nowy napis, w którym zastąpiono wszystkie wystąpienia (lub pierwsze count wystąpień). s.strip() usuwa początkowe i końcowe białe znaki (lub wskazane znaki). Metody zmiany wielkości liter lower(), upper(), capitalize() i swapcase() tworzą nowe napisy — należy pamiętać o zapisaniu zwracanych wartości, ponieważ metody te nie modyfikują napisu. Normalizacja wielkości liter przed porównaniem jest niezbędna w zadaniach niewrażliwych na wielkość liter.

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() i isalnum()

Predykatowe metody napisów zwracają wartość logiczną i działają w czasie O(k), gdzie k oznacza długość wzorca. s.startswith(prefix) i s.endswith(suffix) przyjmują krotki zawierające wiele alternatyw. s.isalpha(), s.isdigit(), s.isalnum() i s.isspace() sprawdzają klasy znaków. Metody te są używane w zadaniach rekrutacyjnych dotyczących poprawnych palindromów, poprawnych liczb i analizowania adresów 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'

ord(), chr() i operacje arytmetyczne na kodach ASCII

ord(c) zwraca punkt kodowy Unicode znaku c. chr(n) konwertuje liczbę całkowitą z powrotem na znak. Dla małych liter wyrażenie ord(c) - ord('a') daje wartości od 0 do 25 — jest to prosty sposób budowania tablic częstotliwości o stałym rozmiarze 26 bez użycia mapy haszującej, w praktyce szybszy dla alfabetu angielskiego. Technika ta pojawia się w zadaniach dotyczących anagramów i palindromów.

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)

Formatowanie napisów na potrzeby wyjścia

Podczas rozmów rekrutacyjnych dotyczących programowania czasami znaczenie ma czytelny format danych wyjściowych. Python oferuje trzy style formatowania: formatowanie %-formatting (stare), .format() (klasyczne) oraz f-stringi (nowoczesne i preferowane). F-stringi są najbardziej czytelne i bezpośrednio obsługują wyrażenia: f'{value:.2f}' formatuje liczbę zmiennoprzecinkową do 2 miejsc po przecinku. Znajomość szybkiego formatowania liczb, dopełniania napisów i wyświetlania tabel skraca czas debugowania pod presją.

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'

Wydajne budowanie napisów za pomocą join()

Łączenie napisów za pomocą + w pętli tworzy nowy napis w każdej iteracji, co dla n znaków daje łączny koszt O(n²). Poprawny wzorzec polega na dodawaniu fragmentów do listy i wywołaniu na końcu ''.join(parts), co działa w czasie O(n). Jest to jeden z najczęstszych antywzorców wydajnościowych w Pythonie. Wspomnienie o tym kompromisie podczas rozmowy rekrutacyjnej pokazuje zrozumienie modelu pamięci Pythona.

# 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'

Analizowanie liczb całkowitych i zmiennoprzecinkowych z napisów

Konwersja między napisami a liczbami jest podstawą zadań związanych z analizowaniem danych. int(s) i float(s) analizują napisy zawierające liczby; dla niepoprawnych danych zgłaszają ValueError. Aby bezpieczniej wykonywać analizowanie, należy użyć bloku try-except. Metody napisów isdigit() i isnumeric() umożliwiają wstępną walidację przed konwersją. Zadania takie jak „atoi” (konwersja napisu na liczbę całkowitą) wymagają obsługi początkowych spacji, znaków liczby i przepełnienia.

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

Wycinanie napisów w zadaniach algorytmicznych

Wycinanie napisów jest bardzo często używane, ale wiąże się z ukrytymi kosztami: s[i:j] tworzy nowy napis o długości j-i w czasie O(j-i). Gdy podnapisy są przekazywane do funkcji rekurencyjnych, warto rozważyć przekazywanie indeksów (start, end) zamiast właściwego podnapisu, aby uniknąć narzutu O(n²) związanego z alokowaniem pamięci. Ta optymalizacja ma znaczenie w zadaniach takich jak znajdowanie najdłuższego podnapisu będącego palindromem, w których sprawdzanych jest wiele podnapisów.

# 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

Szybka ściąga: łańcuchy znaków na rozmowę kwalifikacyjną

Podczas rozmów kwalifikacyjnych warto mieć w pamięci następujące metody operujące na łańcuchach znaków:

  • split / join — parsowanie i budowanie
  • strip / lstrip / rstrip — usuwanie białych znaków
  • lower / upper — normalizacja wielkości liter
  • find / index — lokalizowanie podłańcuchów
  • replace — podstawienia
  • isalnum / isalpha / isdigit — sprawdzanie klasy znaku
  • ord / chr — działania arytmetyczne ASCII w zadaniach ze stałym alfabetem
  • startswith / endswith — sprawdzanie prefiksu i sufiksu

# 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

Szybki test

Proszę sprawdzić znajomość koncepcji przedstawionych w tej lekcji w ramach Data Structures & Algorithms — Coding Interview Prep.

Podsumowanie lekcji

W tej lekcji poznali Państwo: łańcuchy znaków w Pythonie są niezmienne — modyfikacja wymaga zamiany na listę, wprowadzenia zmian, a następnie ponownego połączenia, ord/chr umożliwiają użycie tablic częstości o stałym rozmiarze 26 w zadaniach dotyczących małych liter, które są szybsze niż mapy haszujące dla ograniczonych alfabetów, oraz budowanie łańcuchów znaków za pomocą + w pętli kosztuje O(n²) — należy zawsze gromadzić elementy na liście i na końcu użyć ''.join(), aby uzyskać O(n). W następnej lekcji omówimy technikę przesuwnego okna stosowaną w problemach dotyczących podłańcuchów.

Często zadawane pytania

Czy lekcja „Python String API na rozmowach rekrutacyjnych” jest bezpłatna?

Tak — pełny tekst „Python String API na rozmowach rekrutacyjnych” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Coding Interview Prep, przejdź na CoddyKit PRO. Kurs Coding Interview Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Python String API na rozmowach rekrutacyjnych”?

Przećwiczą Państwo split, join, replace, find, ord/chr oraz wzorce formatowania ciągów występujące w zadaniach rekrutacyjnych dotyczących analizowania i przekształcania tekstu. Ćwiczysz Coding Interview Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Coding Interview Prep?

Nie wymagamy żadnego doświadczenia. Coding Interview Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Python String API na rozmowach rekrutacyjnych”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Coding Interview Prep?

Tak. Każda lekcja Coding Interview Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Python String API na rozmowach rekrutacyjnych
  2. Okno przesuwne dla podciągów
  3. Anagramy i mapy częstotliwości znaków
  4. Kodowanie ciągów, odwracanie i palindromy
← Powrót do Coding Interview Prep