Pythonin merkkijono-API haastattelutehtäviin
Harjoitelkaa split-, join-, replace-, find-, ord/chr- ja merkkijonojen muotoilumalleja, joita esiintyy jäsentämistä ja muunnoksia käsittelevissä haastattelutehtävissä.
Pythonin merkkijono-API haastattelutehtäviin on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 1/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Valmistautuminen ohjelmointihaastatteluihin-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Merkkijonot ovat Pythonissa muuttumattomia
Pythonin merkkijonot ovat muuttumattomia — merkkiä ei voi muuttaa paikallaan. Jokainen merkkijono-operaatio, joka näyttää muokkaavan merkkijonoa, luo todellisuudessa uuden merkkijonon. Tämä tarkoittaa, että s[0] = 'X' aiheuttaa TypeError-virheen. Kun tarvitsette paikallaan tapahtuvaa muokkausta, muuntakaa merkkijono ensin merkkilistaksi, tehkää tarvittavat muutokset ja muodostakaa merkkijono uudelleen komennolla ''.join(chars). Tämä on vakiintunut haastattelumalli merkkijonojen muokkausongelmiin.
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() ja join(): jäsentäminen ja muodostaminen
s.split(sep) jakaa merkkijonon erotinmerkin kohdalta ja palauttaa alimerkkijonojen listan. sep=None (oletusarvo) jakaa merkkijonon minkä tahansa tyhjämerkin kohdalta ja hylkää tyhjät merkkijonot — tämä sopii erinomaisesti välilyönnein erotellun syötteen jäsentämiseen. 'sep'.join(iterable) yhdistää merkkijonot ja lisää niiden väliin erottimen. Idiomi ' '.join(words) on tehokas tapa muodostaa välilyönnein eroteltu merkkijono listasta — älkää käyttäkö +-operaattoria silmukassa.
# 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() ja in
s.find(sub) palauttaa kohteen sub ensimmäisen esiintymän indeksin tai arvon -1, jos kohdetta ei löydy. s.index(sub) toimii samoin, mutta aiheuttaa ValueError-poikkeuksen, jos kohde puuttuu — suosikaa haastattelukoodissa find-menetelmää käsittelemättömien poikkeusten välttämiseksi. Merkkijonojen in-operaattori tekee O(n×m)-aikaisen alimerkkijonohaun, kuten find. Käyttäkää valinnaisia start- ja end-parametreja hakuun viipaleen sisältä ilman kopiointia.
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() ja kirjainkoon käsittelymenetelmät
s.replace(old, new, count=-1) palauttaa uuden merkkijonon, jossa kaikki esiintymät (tai ensimmäiset count esiintymää) on korvattu. s.strip() poistaa alusta ja lopusta tyhjämerkit (tai määritetyt merkit). Kirjainkoon käsittelymenetelmät lower(), upper(), capitalize() ja swapcase() luovat uusia merkkijonoja — muistakaa ottaa niiden palautusarvot talteen, sillä menetelmät eivät muokkaa alkuperäistä merkkijonoa. Kirjainkoon normalisointi ennen vertailua on välttämätöntä kirjainkoosta riippumattomissa ongelmissa.
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() ja isalnum()
Totuusarvon palauttavat merkkijonomenetelmät ovat O(k), missä k on mallin pituus. s.startswith(prefix) ja s.endswith(suffix) hyväksyvät tupleja useita vaihtoehtoja varten. s.isalpha(), s.isdigit(), s.isalnum() ja s.isspace() testaavat merkkiluokkia. Näitä käytetään kelvollisen palindromin, kelvollisen luvun ja URL-osoitteiden jäsentämisen haastatteluongelmissa.
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() ja ASCII-aritmetiikka
ord(c) palauttaa merkin c Unicode-koodipisteen. chr(n) muuntaa kokonaisluvun takaisin merkiksi. Pienillä kirjaimilla ord(c) - ord('a') antaa arvon 0–25 — tämä on siisti tapa muodostaa kiinteän koon 26 frekvenssitaulukkoja ilman hajautustaulukkoa, mikä on käytännössä nopeampaa englannin aakkostolla. Tätä tekniikkaa käytetään anagrammi- ja palindromiongelmissa.
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)Merkkijonojen muotoilu tulostetta varten
Koodaushaastatteluissa myös selkeä tulostus voi olla tärkeää. Python tarjoaa kolme muotoilutapaa: %-muotoilun (vanha), .format()-menetelmän (klassinen) ja f-merkkijonot (moderni ja suositeltava). F-merkkijonot ovat luettavimpia, ja ne tukevat lausekkeita suoraan: f'{value:.2f}' muotoilee liukuluvun kahden desimaalin tarkkuudella. Kun osaatte muotoilla lukuja, täyttää merkkijonoja ja tulostaa taulukoita nopeasti, säästätte aikaa virheenkorjauksessa paineen alla.
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'Tehokas merkkijonojen muodostaminen join()-menetelmällä
Merkkijonojen yhdistäminen +-operaattorilla silmukassa luo uuden merkkijonon jokaisella kierroksella, joten n merkin kokonaiskustannus on O(n²). Oikea malli on lisätä osat listaan ja kutsua lopuksi ''.join(parts)-menetelmää, jolloin aikavaativuus on O(n). Tämä on yksi yleisimmistä Pythonin suorituskykyä heikentävistä vastamalleista. Haastattelussa tämän kompromissin mainitseminen osoittaa, että ymmärrätte Pythonin muistimallin.
# 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'Kokonais- ja liukulukujen jäsentäminen merkkijonoista
Merkkijonojen ja lukujen muuntaminen toisikseen on jäsentämisongelmien perusta. int(s) ja float(s) jäsentävät numeerisia merkkijonoja; virheellinen syöte aiheuttaa ValueError-poikkeuksen. Turvallisempaa jäsentämistä varten käyttäkää try-except-lohkoa. Merkkijonometodit isdigit() ja isnumeric() tarkistavat syötteen ennen muuntamista. atoi-ongelmissa (merkkijonosta kokonaisluvuksi) on käsiteltävä alussa olevat välilyönnit, etumerkit ja ylivuoto.
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')) # 4193Merkkijonojen viipalointi algoritmiongelmissa
Merkkijonojen viipalointia käytetään jatkuvasti, mutta siihen liittyy piilokustannuksia: s[i:j] luo uuden, pituudeltaan j-i olevan merkkijonon ajassa O(j-i). Kun alimerkkijonoja on välitettävä rekursiivisille funktioille, harkitkaa indeksien (start, end) välittämistä varsinaisen alimerkkijonon sijaan, jotta vältätte O(n²):n allokointikustannukset. Tämä optimointi on tärkeä esimerkiksi pisimmän palindromisen alimerkkijonon ongelmissa, joissa testataan monia alimerkkijonoja.
# 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)) # FalseMerkkijonot: työhaastattelun pikamuistio
Pidä nämä merkkijonometodit mielessä työhaastatteluja varten:
split / join— jäsentäminen ja muodostaminenstrip / lstrip / rstrip— tyhjemerkkien poistaminenlower / upper— kirjainkoon normalisointifind / index— alimerkkijonojen etsiminenreplace— korvaaminenisalnum / isalpha / isdigit— merkistöluokan tarkistuksetord / chr— ASCII-laskenta kiinteän aakkoston tehtävissästartswith / endswith— etu- ja jälkiliitteen tarkistukset
# 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')) # FalsePikatesti
Testaa ymmärrystäsi oppitunnin Data Structures & Algorithms — Coding Interview Prep -käsitteistä.
Oppitunnin kertaus
Tässä oppitunnissa opit, että Pythonin merkkijonot ovat muuttumattomia — muuttaminen edellyttää muuntamista listaksi, muokkaamista ja sen yhdistämistä takaisin, ord/chr mahdollistavat 26 alkion frekvenssitaulukot pienaakkosongelmissa, ja ne ovat rajatuilla aakkostoilla hajautustauluja nopeampia ja merkkijonojen rakentaminen +-operaattorilla silmukassa maksaa O(n²) — kokoa merkkijonot aina listaan ja käytä lopuksi ''.join()-kutsua, jotta aikavaativuudeksi tulee O(n). Seuraavaksi tutustumme liukuva ikkuna -tekniikkaan alimerkkijono-ongelmissa.
Opi Valmistautuminen ohjelmointihaastatteluihin tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 90
- Oppitunnit
- 360
Usein kysytyt kysymykset
Onko oppitunti ”Pythonin merkkijono-API haastattelutehtäviin” ilmainen?
Kyllä – oppitunnin ”Pythonin merkkijono-API haastattelutehtäviin” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Valmistautuminen ohjelmointihaastatteluihin-kurssin, päivitä CoddyKit PROhon. Valmistautuminen ohjelmointihaastatteluihin-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Pythonin merkkijono-API haastattelutehtäviin”?
Harjoitelkaa split-, join-, replace-, find-, ord/chr- ja merkkijonojen muotoilumalleja, joita esiintyy jäsentämistä ja muunnoksia käsittelevissä haastattelutehtävissä. Harjoittelet Valmistautuminen ohjelmointihaastatteluihin-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Valmistautuminen ohjelmointihaastatteluihin-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Valmistautuminen ohjelmointihaastatteluihin-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 1/4.
Kuinka kauan ”Pythonin merkkijono-API haastattelutehtäviin”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Valmistautuminen ohjelmointihaastatteluihin-oppitunnilla?
Kyllä. Jokainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Pythonin merkkijono-API haastattelutehtäviin
- Liukuva ikkuna alimerkkijonoille
- Anagrammit ja merkkifrekvenssikartat
- Merkkijonojen koodaus, kääntäminen ja palindromit