Valmistautuminen ohjelmointihaastatteluihin · Oppitunti

Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary

Ratkaiskaa kaksi vaikeaa ongelmaa alusta loppuun — word-ladder-II BFS:n ja backtrackingin avulla sekä alien-dictionary topologisella järjestämisellä — kattavan selityksen kera.

Oppitunti 4/413 vaihetta

Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary on ilmainen Valmistautuminen ohjelmointihaastatteluihin-oppitunti CoddyKitissä. Tämä on oppitunti 4/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.

Miksi vaikeat ongelmat ovat erilaisia

Vaikeat LeetCode-ongelmat eroavat keskitason ongelmista kahdella keskeisellä tavalla: (1) ne edellyttävät vähintään kahden algoritmisen tekniikan yhdistämistä ja (2) optimaalinen ratkaisu ei usein käy ilmi pelkästä tehtävänannosta — teidän on nähtävä pintakuvauksen taakse ja tunnistettava taustalla oleva graafi- tai DP-rakenne. Word Ladder II ja Alien Dictionary ovat vaikeiden ongelmien tyyppiesimerkkejä, ja niitä esiintyy FAANG-haastatteluissa toistuvasti.

Vaikeiden ongelmien lähestymistapa on seuraava: älkää yrittäkö nähdä koko ratkaisua heti. Jakakaa ongelma sen sijaan osaongelmiksi, tunnistakaa kunkin osaongelman rakenne, ratkaiskaa ne itsenäisesti ja yhdistäkää ne lopuksi. Tämä modulaarinen ajattelu on avain vaikeiden ongelmien ratkaisemiseen paineen alla.

# Hard problem meta-strategy
strategy = [
    '1. Read the problem 2x — hard problems often have subtle constraints',
    '2. Model it as a known structure: graph? DP table? sorted order?',
    '3. Break into sub-problems: separate the graph-building from the traversal',
    '4. Solve sub-problems in order, verifying each before connecting',
    '5. Handle the edge case where no solution exists (empty result, -1, [])',
    '6. Optimise only after the correct but slow solution works',
]
print('Hard problem meta-strategy:')
for step in strategy:
    print(f'  {step}')

Word Ladder II: tehtävänanto

Word Ladder II (LeetCode 126): Kun annettuna on aloitussana, lopetussana ja sanalista, etsikää kaikki lyhyimmät muunnosjonot aloituksesta lopetukseen. Jokaisessa vaiheessa täsmälleen yksi merkki muunnetaan, ja jokaisen välissä olevan sanan on kuuluttava sanalistaan. Tämä on selvästi vaikeampi kuin Word Ladder I, jossa etsitään vain yksi lyhin polku, koska teidän on lueteltava kaikki optimaaliset polut.

Esimerkki: beginWord='hit', endWord='cog', wordList=['hot','dot','dog','lot','log','cog'] → [['hit','hot','dot','dog','cog'],['hit','hot','lot','log','cog']]. Molempien pituus on 5.

# Word Ladder II problem breakdown
begin_word = 'hit'
end_word = 'cog'
word_list = ['hot','dot','dog','lot','log','cog']

# What we need:
# 1. Build a graph: word -> set of words that differ by one character
# 2. BFS to find the MINIMUM number of steps (shortest path distance)
# 3. DFS/backtracking to enumerate ALL paths of that minimum length

# Key insight: BFS finds shortest distance; DFS reconstructs all shortest paths
# Two-phase approach:
print('Phase 1: BFS from begin_word to find min distance to each word')
print('Phase 2: DFS/backtrack from end_word using only edges that decrease distance')
print()
print(f'Input: {begin_word} -> {end_word}')
print(f'Word list: {word_list}')
print('Expected: [[hit,hot,dot,dog,cog],[hit,hot,lot,log,cog]]')

Word Ladder II: BFS-vaihe

Vaiheessa 1 suoritetaan BFS taso kerrallaan aloitussanasta lähtien. Jokaisella tasolla etsitään kaikki naapurit eli sanat, jotka poikkeavat yhdestä merkistä. Tallennamme tason eli etäisyyden aloitussanasta, jolla kukin sana saavutetaan ensimmäisen kerran. Emme pysähdy, kun saavutamme end_word-sanan, vaan jatkamme sen tason loppuun, jolla end_word löytyi, jotta kaikki lyhimmät polut tulevat tutkituiksi.

Ratkaisevan tärkeää on rakentaa parents-sanakirja, joka yhdistää jokaiseen sanaan niiden sanojen joukon, jotka voivat edeltää sitä millä tahansa lyhimmällä polulla. Tätä graafia käytetään vaiheessa 2 takaisinhakuun.

from collections import defaultdict, deque

def find_parents(begin, end, word_set):
    parents = defaultdict(set)
    layer = {begin}
    found = False

    while layer and not found:
        next_layer = set()
        for word in layer:
            for i in range(len(word)):
                for c in 'abcdefghijklmnopqrstuvwxyz':
                    new_word = word[:i] + c + word[i+1:]
                    if new_word in word_set and new_word not in parents:
                        next_layer.add(new_word)
                        parents[new_word].add(word)
                        if new_word == end:
                            found = True
        layer = next_layer
    return parents if found else {}

words = {'hot','dot','dog','lot','log','cog'}
parents = find_parents('hit', 'cog', words)
print('Parents map (which words can precede each word):')
for word, preds in sorted(parents.items()):
    print(f'  {word}: {preds}')

Word Ladder II: DFS-takaisinhakuvaihe

Vaiheessa 2 suoritetaan DFS-takaisinhaku lopetussanasta alkaen ja seurataan parents-kuvausta käänteisessä järjestyksessä. Polut rakennetaan lopusta alkuun ja käännetään sitten. Kun saavumme aloitussanaan, olemme löytäneet kokonaisen lyhimmän polun. Parents-kuvaus takaa, että kaikki löydetyt polut ovat vähimmäispituisia — emme voi 'poiketa' pidemmälle polulle.

Tämä kaksivaiheinen lähestymistapa (BFS tasojen määrittämiseen, DFS polkujen rekonstruointiin) on vakiintunut ratkaisu. Sen aikavaativuus on BFS:lle O(n × L × 26), missä n = sanalistan koko ja L = sanan pituus, sekä DFS:lle O(K × L), missä K = lyhyimpien polkujen määrä.

def find_ladders(beginWord, endWord, wordList):
    word_set = set(wordList)
    if endWord not in word_set:
        return []

    # Phase 1: BFS to build parents map
    parents = defaultdict(set)
    layer = {beginWord}
    found = False
    visited = {beginWord}

    while layer and not found:
        next_layer = set()
        for word in layer:
            for i in range(len(word)):
                for c in 'abcdefghijklmnopqrstuvwxyz':
                    nw = word[:i] + c + word[i+1:]
                    if nw in word_set and nw not in visited:
                        next_layer.add(nw)
                        parents[nw].add(word)
                        if nw == endWord: found = True
        visited |= next_layer
        layer = next_layer

    # Phase 2: DFS backtrack from endWord to beginWord
    result = []
    def dfs(word, path):
        if word == beginWord:
            result.append(path[::-1])
            return
        for parent in parents[word]:
            dfs(parent, path + [parent])
    dfs(endWord, [endWord])
    return result

print(find_ladders('hit','cog',['hot','dot','dog','lot','log','cog']))

Alien Dictionary: tehtävänanto

Alien Dictionary (LeetCode 269): Kun annettuna on joukko muukalaiskielen leksikografisesti järjestettyjä sanoja, määrittäkää kyseisen kielen merkkien järjestys. Palauttakaa merkkien järjestys merkkijonona. Jos kelvollista järjestystä ei ole ristiriitojen vuoksi, palauttakaa tyhjä merkkijono.

Esimerkki: ['wrt','wrf','er','ett','rftt'] → 'wertf'. Vertaamalla vierekkäisiä sanoja saadaan: 't' < 'f' (sanoista wrt ja wrf), 'w' < 'e' (sanoista wrt ja er), 'r' < 't' (sanoista er ja ett) sekä 'e' < 'r' (sanoista ett ja rftt). Kyseessä on näiden merkkien järjestysrajoitteiden topologinen lajittelu.

words = ['wrt', 'wrf', 'er', 'ett', 'rftt']
# Compare adjacent pairs to extract ordering:
# wrt vs wrf: first diff at index 2: t < f  (t comes before f)
# wrf vs er:  first diff at index 0: w < e  (w comes before e)
# er  vs ett: first diff at index 1: r < t  (r comes before t)
# ett vs rftt:first diff at index 0: e < r  (e comes before r)

ordering_constraints = [
    ('t', 'f', 'from wrt vs wrf'),
    ('w', 'e', 'from wrf vs er'),
    ('r', 't', 'from er vs ett'),
    ('e', 'r', 'from ett vs rftt'),
]
print('Ordering constraints extracted from adjacent word pairs:')
for a, b, source in ordering_constraints:
    print(f'  {a} -> {b}  ({source})')
print('\nThis is a directed graph: find topological order = alien alphabet order')

Alien Dictionary: graafin rakentaminen

Ensimmäinen vaihe on rajoitteiden poimiminen: verratkaa jokaista vierekkäistä sanaparia, etsikää ensimmäinen toisistaan poikkeava merkki ja lisätkää suunnattu särmä pienemmästä merkistä suurempaan. Jos sana on seuraavan sanan etuliite mutta pidempi kuin seuraava sana (esimerkiksi 'abc' ennen sanaa 'ab'), syöte on virheellinen — palauttakaa heti tyhjä merkkijono.

Kaikki sanalistassa esiintyvät merkit ovat graafin solmuja, vaikka niillä ei olisi järjestysrajoitteita. Nämä irralliset solmut voivat esiintyä lopullisessa järjestyksessä missä tahansa.

from collections import defaultdict

def build_alien_graph(words):
    adj = defaultdict(set)    # char -> set of chars that come after it
    in_degree = {c: 0 for word in words for c in word}

    for i in range(len(words) - 1):
        w1, w2 = words[i], words[i+1]
        min_len = min(len(w1), len(w2))
        found_diff = False
        for j in range(min_len):
            if w1[j] != w2[j]:
                if w2[j] not in adj[w1[j]]:   # avoid duplicate edges
                    adj[w1[j]].add(w2[j])
                    in_degree[w2[j]] += 1
                found_diff = True
                break
        if not found_diff and len(w1) > len(w2):
            return {}, {}   # invalid: 'abc' before 'ab'
    return adj, in_degree

words = ['wrt', 'wrf', 'er', 'ett', 'rftt']
adj, in_degree = build_alien_graph(words)
print('Adjacency list (directed):', {k: list(v) for k, v in adj.items()})
print('In-degrees:', in_degree)

Alien Dictionary: topologinen lajittelu

Kun graafi on rakennettu, suorittakaa Kahnin BFS-topologinen lajittelu: alustakaa jono kaikilla merkeillä, joiden tuloaste on 0 eli joilla ei ole edeltäjiä. Käsitelkää kukin merkki ja pienentäkää sen seuraajien tuloastetta. Kun seuraajan tuloaste saavuttaa arvon 0, lisätkää se jonoon. Kootkaa merkit käsittelyjärjestyksessä — tämä on muukalaiskielen aakkosjärjestys.

Jos tuloksessa ovat kaikki merkit, järjestys on kelvollinen. Jos merkkejä on odotettua vähemmän, graafissa on sykli — rajoitteet ovat ristiriidassa, joten palautamme tyhjän merkkijonon.

from collections import deque, defaultdict

def alien_order(words):
    adj = defaultdict(set)
    in_degree = {c: 0 for word in words for c in word}

    for i in range(len(words) - 1):
        w1, w2 = words[i], words[i + 1]
        min_len = min(len(w1), len(w2))
        found = False
        for j in range(min_len):
            if w1[j] != w2[j]:
                if w2[j] not in adj[w1[j]]:
                    adj[w1[j]].add(w2[j])
                    in_degree[w2[j]] += 1
                found = True; break
        if not found and len(w1) > len(w2):
            return ''    # invalid: 'abc' before 'ab'

    # Kahn's BFS topological sort
    queue = deque([c for c in in_degree if in_degree[c] == 0])
    result = []
    while queue:
        c = queue.popleft()
        result.append(c)
        for neighbor in sorted(adj[c]):   # sort for determinism
            in_degree[neighbor] -= 1
            if in_degree[neighbor] == 0:
                queue.append(neighbor)

    return ''.join(result) if len(result) == len(in_degree) else ''

print(alien_order(['wrt','wrf','er','ett','rftt']))  # e.g., 'wertf'
print(alien_order(['z','x']))                         # 'zx'
print(alien_order(['z','x','z']))                     # '' (cycle z->x->z)

Reunatapausten käsittely: molemmat ongelmat

Sekä Word Ladder II:ssa että Alien Dictionaryssa on hienovaraisia reunatapauksia, jotka johtavat vääriin vastauksiin, jos niitä ei käsitellä:

  • Word Ladder II: beginWord ja endWord ovat samat (palauttakaa [[beginWord]] tai yhden alkion polku). endWord ei kuulu wordList-listaan (palauttakaa tyhjä). Polkua ei ole (palauttakaa tyhjä).
  • Alien Dictionary: toistuvat sanat (niistä ei poimita rajoitetta). Yksi sana (palauttakaa kaikki yksilölliset merkit). Rajoitteissa on sykli (palauttakaa ''). Sana on seuraavan sanan pidempi etuliite (virheellinen syöte, palauttakaa ''). Kaikki merkit ovat irrallisia (palauttakaa mikä tahansa järjestys).
# Edge case tests for Word Ladder II
def test_word_ladder_edge_cases():
    from collections import defaultdict
    def find_ladders(begin, end, word_list):
        # [abbreviated implementation for testing]
        if end not in word_list: return []
        if begin == end: return [[begin]]
        return []  # placeholder

    tests = [
        ('hit', 'cog', ['hot','dot','dog','lot','log'], []),  # no path (cog missing)
        ('hit', 'hit', ['hit'], [['hit']]),                   # begin==end
        ('a',   'c',  ['a','b','c'], [['a','c']]),            # short words
    ]
    for begin, end, wl, expected in tests:
        result = find_ladders(begin, end, wl)
        print(f'{begin}->{end}: result={result}')

# Edge case tests for Alien Dictionary
def test_alien_edge_cases():
    from collections import defaultdict, deque
    # (using alien_order from previous scene)
    tests = [
        (['abc', 'ab'], ''),          # 'abc' before 'ab' = invalid
        (['a'],         'a'),          # single word
        (['z','z'],     'z'),          # duplicate: no constraint
    ]
    print('Alien dictionary edge cases:')
    for words, expected in tests:
        print(f'  {words} -> expected: "{expected}"')

test_word_ladder_edge_cases()
test_alien_edge_cases()

Monimutkaisuusanalyysi: molemmat ongelmat

Word Ladder II:n vaativuus: BFS-vaiheen aikavaativuus on O(n × L × 26), missä n = sanalistan sanojen määrä ja L = sanan pituus. Jokaiselle sanalle kullakin BFS-tasolla muodostetaan 26L ehdokassanaa, ja niiden jäsenyys sanajoukossa tarkistetaan vakioajassa O(1) tarkistusta kohden. DFS-vaiheen aikavaativuus on O(K × L), missä K = lyhyimpien polkujen määrä; teoriassa määrä voi kasvaa eksponentiaaliseksi.

Alien Dictionaryn vaativuus: graafin rakentamisen aikavaativuus on O(C), missä C = kaikkien sanojen merkkien kokonaismäärä. Topologisen lajittelun vaativuus on O(V + E), missä V = yksilöllisten merkkien määrä ja E = järjestysrajoitteiden määrä. Kokonaisvaativuus on O(C), eli O(syötteen merkkien kokonaismäärästä).

# Complexity analysis for both problems
complexities = [
    {
        'problem': 'Word Ladder II',
        'time': 'O(n * L * 26) BFS + O(K * L) DFS backtracking',
        'space': 'O(n * L) for word set + parents map',
        'notes': 'K (number of shortest paths) can be exponential in pathological cases',
    },
    {
        'problem': 'Alien Dictionary',
        'time': 'O(C) where C = total characters in all words',
        'space': 'O(V + E) for adjacency list',
        'notes': 'V <= 26 (alphabet), E <= V^2 = 676; often treated as O(C) total',
    },
]
for c in complexities:
    print(f'{c["problem"]}:')
    print(f'  Time:  {c["time"]}')
    print(f'  Space: {c["space"]}')
    print(f'  Notes: {c["notes"]}')
    print()

Mallin yhteenveto: kaksi uudelleenkäytettävää mallipohjaa

Molemmat ongelmat opettavat uudelleenkäytettäviä malleja. Word Ladder II = BFS etäisyyksien määrittämiseen + DFS polkujen rekonstruointiin: tätä mallia käytetään aina, kun painottamattomasta graafista tarvitaan kaikki lyhimmät polut. Rakentakaa parents-kartta BFS:n aikana ja suorittakaa sitten takaisinhaku kohteesta lähtösolmuun.

Alien Dictionary = särmien poimiminen + topologinen lajittelu: tätä mallia käytetään, kun annettuna on järjestetty jono ja sen taustalla olevat järjestyssäännöt on pääteltävä. Poimikaa suunnatut rajoitteet vierekkäisistä pareista ja suorittakaa sitten Kahnin algoritmi. Palauttakaa '' syklin havaitsemisen yhteydessä, koska järjestys on silloin mahdoton.

# Pattern templates
print('Template 1: All Shortest Paths in Unweighted Graph')
template_1 = '''
1. BFS from source, recording parents[node] = set of nodes that lead to node
2. Continue each BFS level fully (do not stop at first endNode reach)
3. DFS backtrack from endNode, following parents map
4. Reverse each path found (built end->start, need start->end)
'''
print(template_1)

print('Template 2: Infer Ordering from Sorted Sequence')
template_2 = '''
1. Compare adjacent pairs, extract first differing element as directed constraint
2. Build adjacency list + in-degree map
3. Check for invalid input (prefix longer than successor)
4. Kahn's BFS topological sort
5. If result length < number of nodes => cycle => return invalid
'''
print(template_2)

Varmuuden rakentaminen vaikeiden ongelmien ratkaisemiseen

Vaikeat ongelmat vaikuttavat aluksi mahdottomilta, mutta oikean ajattelumallin avulla niistä tulee lähestyttäviä. Keskeiset oivallukset ovat seuraavat:

  • Erottakaa vastuualueet: ratkaiskaa kukin osaongelma itsenäisesti ennen niiden yhdistämistä
  • Tuntekaa rakennuspalikat: BFS/DFS, topologinen lajittelu, Dijkstra ja DP-taulukot — vaikeat ongelmat yhdistävät näitä tavoilla, jotka eivät ole ilmeisiä
  • Aloittakaa esimerkeistä: käykää ongelma manuaalisesti läpi pienen esimerkin avulla löytääksenne sen taustalla olevan rakenteen
  • Tarkistakaa osaongelmat: tulostakaa graafi vaiheen 1 (graafin rakentamisen) toteuttamisen jälkeen ja tarkistakaa se manuaalisesti ennen vaiheeseen 2 siirtymistä
# Hard problem confidence-building practice plan
practice_plan = [
    ('Week 1', 'BFS/DFS fundamentals', ['Number of Islands', 'Clone Graph', 'Word Ladder I']),
    ('Week 2', 'Topological sort', ['Course Schedule I & II', 'Alien Dictionary (easy)']),
    ('Week 3', 'All-paths problems', ['All Paths to Target', 'Word Ladder II (hard)']),
    ('Week 4', 'Hard combos', ['Minimum Window Substring', 'Serialize/Deserialize Tree']),
]
print('4-week hard problem practice plan:')
for week, theme, problems in practice_plan:
    print(f'\n{week} — {theme}:')
    for p in problems:
        print(f'  - {p}')

print('\nAfter each problem, write:')
print('  1. The pattern it belongs to')
print('  2. The 2-3 key sub-problems')
print('  3. One insight you would not have had before solving it')

Pikatesti

Testatkaa, miten hyvin ymmärrätte tämän oppitunnin Data Structures & Algorithms — Coding Interview Prep -kurssin käsitteet.

Oppitunnin kertaus

Tässä oppitunnissa opitte, että Word Ladder II rakentaa BFS:n avulla parents-kartan, joka sisältää kaikkien lyhimpien polkujen edeltäjät, ja luettelee sitten kaikki lyhimmät polut DFS-takaisinhaulla seuraamalla parents-karttaa lopusta alkuun, Alien Dictionary poimii suunnatut rajoitteet vierekkäisistä sanapareista ja järjestää merkit Kahnin topologisella lajittelulla sekä palauttaa tyhjän merkkijonon, jos sykli havaitaan ja vaikeat ongelmat voidaan jakaa useiksi osaongelmiksi — graafin rakentamiseksi, etäisyyksien etsimiseksi ja polkujen rekonstruoimiseksi — jotka ratkaistaan itsenäisesti tutuilla algoritmeilla. Olette nyt suorittaneet koko DSA Interview Prep -kurssin. Soveltakaa tämän kokonaisuuden kaikkia malleja ja tekniikoita haastatteluissanne luottavaisin mielin.

Aloita maksutta

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 ”Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary” ilmainen?

Kyllä – oppitunnin ”Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary” 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 ”Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary”?

Ratkaiskaa kaksi vaikeaa ongelmaa alusta loppuun — word-ladder-II BFS:n ja backtrackingin avulla sekä alien-dictionary topologisella järjestämisellä — kattavan selityksen kera. 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 4/4.

Kuinka kauan ”Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary”-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

  1. Mallien tunnistamisen lunttilista
  2. Ajastettu harjoitushaastattelu: helpot ja keskivaikeat ongelmat
  3. Reunatapausten käsittely ja viestintä haastattelussa
  4. Vaikeiden ongelmien läpikäynti: Word Ladder II ja Alien Dictionary
← Takaisin: Valmistautuminen ohjelmointihaastatteluihin