Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer
Løs tre problemer innen en tidsgrense på 45 minutter, forklar tankegangen høyt slik De ville gjort i et ekte intervju, og gå gjennom optimale løsninger etterpå.
Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer er en gratis leksjon i DSA Interview Prep på CoddyKit. Dette er leksjon 2 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i DSA Interview Prep, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i DSA Interview Prep inneholder totalt 4 leksjoner.
Slik bruker du dette prøveintervjuet
Denne leksjonen simulerer en ekte kodeintervjuøkt. For hver oppgave skal du: (1) lese den én gang, (2) identifisere mønsteret innen 60 sekunder, (3) forklare tilnærmingen din og kompleksiteten, (4) skrive løsningen og (5) teste med eksempler. Sett en tidtaker. En lett oppgave bør ta 10–15 minutter, mens en middels vanskelig oppgave bør ta 20–25 minutter.
Ikke se på løsningen på forhånd — da forsvinner hensikten. Hvis du står fast etter 5 minutter, les oppgaveteksten på nytt og se etter signalordet som avslører mønsteret (sortert? minimum? alle kombinasjoner? delarray?). Evnen til å komme deg videre på egen hånd er like viktig som evnen til å løse oppgaven raskt.
# Mock interview timer simulation
import time
class InterviewTimer:
def __init__(self, total_minutes):
self.total = total_minutes * 60
self.start = None
def begin(self, problem_name):
self.start = time.time()
print(f'TIMER STARTED: {problem_name}')
print(f'You have {self.total//60} minutes. Go!')
def checkpoint(self, label):
if self.start:
elapsed = time.time() - self.start
remaining = self.total - elapsed
print(f'[{label}] Elapsed: {elapsed:.0f}s, Remaining: {remaining:.0f}s')
# Usage in real practice:
timer = InterviewTimer(15) # 15-minute easy problem
timer.begin('Two Sum')
time.sleep(1)
timer.checkpoint('Identified pattern')Lett oppgave 1: Gyldige parenteser
Oppgave: Gitt en streng som bare inneholder '(', ')', '{', '}', '[', ']', skal du avgjøre om inndatastrengen er gyldig. En streng er gyldig hvis hver åpningsparentes lukkes av samme type parentes i riktig rekkefølge.
Signal: Samsvarende par, rekkefølgen er viktig, og den sist åpnede parentesen må lukkes først → Stack. Legg åpningsparenteser på stacken; ta dem av og kontroller dem når du møter lukkende parenteser. Hvis stacken er tom når du prøver å ta ut et element, eller har elementer igjen til slutt, er strengen ugyldig. Tid O(n), plass O(n).
def is_valid(s):
stack = []
matching = {')': '(', '}': '{', ']': '['}
for char in s:
if char in '({[':
stack.append(char)
else:
if not stack or stack[-1] != matching[char]:
return False
stack.pop()
return len(stack) == 0
# Test cases
test_cases = [
('()', True),
('()[]{}' , True),
('(]', False),
('([)]', False),
('{[]}', True),
('', True), # empty string is valid
('(((', False), # unmatched opens
(')]', False), # close without open
]
for s, expected in test_cases:
result = is_valid(s)
status = 'PASS' if result == expected else 'FAIL'
print(f'{status}: is_valid({repr(s)}) = {result} (expected {expected})')Lett oppgave 2: Beste tidspunkt for kjøp og salg av aksjer
Oppgave: Gitt et array prices der prices[i] er aksjeprisen på dag i, skal du finne den maksimale fortjenesten fra ett kjøp og ett salg (du må kjøpe før du selger). Returner 0 hvis det ikke er mulig å oppnå fortjeneste.
Signal: Maksimal forskjell der venstre posisjon må komme før høyre → Hold rede på det løpende minimumet mens du går fra venstre mot høyre. Hver dag er den mulige fortjenesten current_price - min_so_far. Oppdater den maksimale fortjenesten. Dette er O(n)/O(1) og et spesialtilfelle av Kadane's algorithm.
def max_profit(prices):
if not prices:
return 0
min_price = float('inf')
max_profit = 0
for price in prices:
if price < min_price:
min_price = price
elif price - min_price > max_profit:
max_profit = price - min_price
return max_profit
# Test cases
test_cases = [
([7, 1, 5, 3, 6, 4], 5), # buy at 1, sell at 6
([7, 6, 4, 3, 1], 0), # monotonically decreasing: no profit
([2, 4, 1], 2), # buy at 2, sell at 4
([1], 0), # single price: no transaction possible
([3, 3, 3], 0), # flat: no profit
]
for prices, expected in test_cases:
result = max_profit(prices)
status = 'PASS' if result == expected else 'FAIL'
print(f'{status}: max_profit({prices}) = {result} (expected {expected})')Middels vanskelig oppgave 1: 3Sum
Oppgave: Gitt et array, finn alle unike tripletter som har sum lik null. Løsningen må ikke inneholde dupliserte tripletter.
Mønster: To pekere utvidet til tre elementer. Sorter arrayet. For hvert element nums[i] bruker du to pekere left = i+1, right = n-1 for å finne par med sum lik -nums[i]. Hopp over duplikater ved å flytte pekerne forbi identiske verdier. Tid O(n²), plass O(1) unntatt resultatet. Sorteringen gjør håndteringen av duplikater oversiktlig.
def three_sum(nums):
nums.sort()
result = []
n = len(nums)
for i in range(n - 2):
# Skip duplicate values for the first element
if i > 0 and nums[i] == nums[i - 1]:
continue
left, right = i + 1, n - 1
while left < right:
total = nums[i] + nums[left] + nums[right]
if total == 0:
result.append([nums[i], nums[left], nums[right]])
while left < right and nums[left] == nums[left + 1]:
left += 1 # skip duplicate lefts
while left < right and nums[right] == nums[right - 1]:
right -= 1 # skip duplicate rights
left += 1; right -= 1
elif total < 0:
left += 1
else:
right -= 1
return result
print(three_sum([-1, 0, 1, 2, -1, -4])) # [[-1,-1,2],[-1,0,1]]
print(three_sum([0, 0, 0, 0])) # [[0,0,0]]
print(three_sum([])) # []
print(three_sum([1, 2, -2, -1])) # []Middels vanskelig oppgave 2: Lengste delstreng uten gjentatte tegn
Oppgave: Gitt en streng, finn lengden på den lengste delstrengen uten gjentatte tegn.
Mønster: Sliding window med et set (eller en dict med siste posisjoner). Oppretthold et vindu [left, right]. Utvid right ved å ta med hvert tegn. Hvis et tegn gjentas (allerede i vinduet), krymp fra venstre til duplikatet er fjernet. Hold oversikt over den største vindusstørrelsen som er observert. Tid O(n), plass O(min(n, alphabet_size)).
def length_of_longest_substring(s):
char_index = {} # character -> last seen index
left = 0
max_len = 0
for right, char in enumerate(s):
if char in char_index and char_index[char] >= left:
left = char_index[char] + 1 # shrink window past duplicate
char_index[char] = right
max_len = max(max_len, right - left + 1)
return max_len
# Test cases
test_cases = [
('abcabcbb', 3), # 'abc'
('bbbbb', 1), # 'b'
('pwwkew', 3), # 'wke'
('', 0), # empty string
('au', 2), # full string
('dvdf', 3), # 'vdf' (skip the first d)
]
for s, expected in test_cases:
result = length_of_longest_substring(s)
status = 'PASS' if result == expected else 'FAIL'
print(f'{status}: len_longest({repr(s)}) = {result} (expected {expected})')Middels vanskelig oppgave 3: Myntveksling
Oppgave: Gitt myntvalører og et målbeløp, finn det minste antallet mynter som trengs for å nå beløpet. Returner -1 hvis det er umulig.
Mønster: Klassisk endimensjonal dynamisk programmering (variant av det ubegrensede ryggsekkproblemet). dp[i] = minste antall mynter for beløp i. Initialiser dp[0] = 0, og alle andre verdier til uendelig. For hvert beløp fra 1 til målbeløpet prøver De alle myntvalørene. dp[i] = min(dp[i], dp[i - coin] + 1) for hver gyldige mynt. Tid O(amount × len(coins)), plass O(amount).
def coin_change(coins, amount):
dp = [float('inf')] * (amount + 1)
dp[0] = 0 # 0 coins to make amount 0
for i in range(1, amount + 1):
for coin in coins:
if coin <= i and dp[i - coin] + 1 < dp[i]:
dp[i] = dp[i - coin] + 1
return dp[amount] if dp[amount] != float('inf') else -1
# Test cases
test_cases = [
([1, 5, 11], 15, 3), # 11+1+1+1+1... wait: 11+1+1+1+1=5 coins? No: 5+5+5=3
([2], 3, -1), # impossible (only even coins)
([1], 0, 0), # 0 coins for amount 0
([1, 2, 5], 11, 3), # 5+5+1
([186, 419, 83, 408], 6249, 20), # stress test
]
for coins, amount, expected in test_cases:
result = coin_change(coins, amount)
status = 'PASS' if result == expected else 'FAIL'
print(f'{status}: coin_change({coins}, {amount}) = {result} (expected {expected})')Arbeidsflyt for problemløsing under tidspress
Når tiden begynner å renne ut, prioriter i denne rekkefølgen: (1) en fungerende brute-force-løsning med riktig resultat fremfor en ufullstendig optimal løsning, (2) håndter kanttilfeller på en tydelig måte, (3) skriv ren og lettlest kode i stedet for smarte one-linere. Intervjuere foretrekker en ryddig O(n²)-løsning som består alle testtilfeller, fremfor en O(n)-løsning med en vanskelig oppdagbar feil.
Hvis De innser at O(n²)-løsningen er feil, må De ikke forkaste den halvveis – fullfør den, test den, og tilby å optimalisere den hvis tiden tillater det. En halvskrevet optimal løsning gir mindre uttelling enn en komplett, men mindre optimal løsning.
# Priority order when time runs out
priority = [
('First priority', 'Correct brute-force that passes all test cases'),
('Second priority', 'Optimal solution with bugs is WORSE than suboptimal correct'),
('Third priority', 'Edge cases handled visibly (empty input, single element, negatives)'),
('Fourth priority', 'Clean variable names and readable code'),
('Fifth priority', 'Add complexity statement as a comment at the top'),
]
print('Under time pressure, prioritise:')
for priority_level, desc in priority:
print(f' {priority_level}: {desc}')
# Adding complexity as a comment
def two_sum_commented(nums, target):
# Time: O(n), Space: O(n)
seen = {}
for i, n in enumerate(nums):
complement = target - n
if complement in seen:
return [seen[complement], i]
seen[n] = i
return []Gjennomgang av løsningen: Fem spørsmål
Før De sier «Jeg er ferdig», bør De stille Dem selv disse fem spørsmålene:
- Håndterer løsningen tom input?
[],'',None, n=0 - Håndterer løsningen ett enkelt element? Arrayer med størrelse 1, trær med én node
- Håndterer løsningen elementer som alle er like?
[5, 5, 5, 5],'aaaa' - Håndterer løsningen minste og største verdier? Negative tall, svært store heltall, 0
- Har De oppgitt tids- og plasskompleksiteten? Big-O med en kort begrunnelse
Disse fem kontrollene avdekker de fleste feil i intervjuløsninger. Intervjuere forventer at kandidater tester løsningene sine selv – de vil ikke fortelle Dem at løsningen har en feil med mindre De ber om tilbakemelding.
# The five edge-case categories with examples
edge_cases = {
'Empty input': ['[] empty array', '"" empty string', 'None / null'],
'Single element': ['[42]', 'single node tree', 'n=1'],
'All same': ['[3,3,3,3]', '"aaaa"', 'uniform grid'],
'Extreme values': ['[-10^9, 10^9]', 'INT_MAX + 1 overflow check', '0 as input'],
'Already sorted': ['ascending + descending', 'already optimal input'],
}
for category, examples in edge_cases.items():
print(f'{category}:')
for ex in examples:
print(f' - {ex}')
print()
# Template for self-testing:
def test_my_solution(fn, test_cases):
for inputs, expected in test_cases:
result = fn(*inputs) if isinstance(inputs, tuple) else fn(inputs)
status = 'PASS' if result == expected else 'FAIL'
print(f'{status}: {inputs} => {result} (expected {expected})')Håndtering av oppfølgingsspørsmål
Etter at De har løst oppgaven, stiller intervjuere vanligvis oppfølgingsspørsmål. Vanlige typer:
- «Kan De gjøre det med O(1)-plass?» → Se etter modifikasjon på stedet eller matematiske knep
- «Hva om n er svært stor?» → Diskuter tilnærminger basert på streaming, paginering eller sampling
- «Hva om arrayet allerede er sortert?» → Det finnes ofte en enklere algoritme
- «Kan De parallellisere dette?» → Finn uavhengige delproblemer og diskuter MapReduce eller oppgaveparallellitet
Oppfølgingsspørsmål tester dybde og tilpasningsevne. Si «La meg tenke et øyeblikk» i stedet for å gjette med én gang. En gjennomtenkt pause er bedre enn et feil svar som leveres med selvtillit.
# Follow-up answers for classic problems
follow_ups = [
{
'problem': 'Find duplicate in array 1..n (space O(n) solution uses set)',
'follow_up': 'Can you do it in O(1) space without modifying input?',
'answer': 'Floyd cycle detection: treat array as linked list (slow/fast pointer)',
},
{
'problem': 'Reverse a string (space O(n) with new array)',
'follow_up': 'Can you do it in-place?',
'answer': 'Two pointers from both ends, swap until they meet: O(n) time O(1) space',
},
{
'problem': 'Find max in array: O(n) single pass',
'follow_up': 'What if the array is streamed one element at a time?',
'answer': 'Same algorithm works! Running maximum handles infinite streams',
},
{
'problem': 'Merge sorted arrays O(n+m)',
'follow_up': 'What if you have K sorted arrays?',
'answer': 'Use a min-heap of (value, array_idx, element_idx): O(n log k)',
},
]
for fu in follow_ups:
print(f'Problem: {fu["problem"]}')
print(f'Follow-up: {fu["follow_up"]}')
print(f'Answer: {fu["answer"]}\n')Øvingsoppgave: Gruppér anagrammer
Oppgave: Gitt et array med strenger, grupper anagrammene sammen. Returner en liste med grupper.
Mønster: Frekvenskart som nøkkel. For hver streng sorterer De tegnene (eller beregner en tuppel med tegnfrekvenser) som den kanoniske nøkkelen. Gruppér strengene etter denne nøkkelen ved hjelp av et hash map med lister. Tid O(n × m log m), der m er den maksimale strenglengden, plass O(n × m). Ingen nøstede løkker er nødvendige – én gjennomgang av arrayet.
from collections import defaultdict
def group_anagrams(strs):
# Method 1: sort each string as key
groups = defaultdict(list)
for s in strs:
key = ''.join(sorted(s)) # canonical form
groups[key].append(s)
return list(groups.values())
def group_anagrams_v2(strs):
# Method 2: character count tuple as key (avoids sorting)
groups = defaultdict(list)
for s in strs:
count = [0] * 26
for c in s:
count[ord(c) - ord('a')] += 1
key = tuple(count) # immutable, hashable
groups[key].append(s)
return list(groups.values())
test = ['eat', 'tea', 'tan', 'ate', 'nat', 'bat']
result = [sorted(g) for g in group_anagrams(test)]
result.sort()
print('Groups:', result)
# [['ate','eat','tea'], ['bat'], ['nat','tan']]
print('V2:', [sorted(g) for g in sorted(group_anagrams_v2(test), key=len)])Selvvurdering etter et prøveintervju
Etter hvert prøveintervju bør De vurdere Dem selv på disse områdene:
- Hurtighet i mønstergjenkjenning: Identifiserte De mønsteret på <60 sekunder?
- Korrekt kode: Besto den første løsningen Deres alle testtilfellene?
- Håndtering av kanttilfeller: Testet De tom, enkel og ekstrem input?
- Kommunikasjon: Forklarte De tankegangen Deres underveis?
- Kompleksitetsforståelse: Oppga De tids- og plasskompleksiteten?
- Evne til å komme videre: Hvis De satt fast, endret De tilnærming på en god måte eller låste De Dem?
Vurder Dem selv fra 1 til 5 på hvert område. Fokuser neste ukes øving på området som fikk lavest vurdering. De fleste kandidater trenger å forbedre enten mønstergjenkjenning eller kommunikasjon – sjelden begge deler.
# Self-assessment scoring template
def self_assess(pattern_speed, code_correctness, edge_cases,
communication, complexity, recovery):
scores = {
'Pattern recognition (< 60s)': pattern_speed,
'Code correctness (all tests pass)': code_correctness,
'Edge case handling': edge_cases,
'Communication (thinking aloud)': communication,
'Complexity stated correctly': complexity,
'Recovery when stuck': recovery,
}
total = sum(scores.values())
max_total = len(scores) * 5
print('Self-Assessment Results:')
print('-'*50)
for dim, score in scores.items():
bar = '#' * score + '-' * (5 - score)
print(f'{dim:45s} [{bar}] {score}/5')
print(f'\nTotal: {total}/{max_total} ({total/max_total*100:.0f}%)')
weak = min(scores, key=scores.get)
print(f'Focus area: {weak}')
self_assess(4, 3, 4, 3, 5, 2) # example scoresRask sjekk
Test forståelsen Deres av konseptene fra leksjonen i Data Structures & Algorithms — Coding Interview Prep.
Oppsummering av leksjonen
I denne leksjonen lærte De: å angripe oppgaver med en fast arbeidsflyt – lese, identifisere mønsteret på 60 sekunder, oppgi kompleksiteten, skrive kode og deretter teste med fem kategorier av kanttilfeller, at en fungerende brute-force-løsning er bedre enn en ufullstendig optimal løsning når tiden begynner å renne ut, og at selvvurdering etter hver prøveintervjuøkt på seks dimensjoner (hurtighet, korrekthet, kanttilfeller, kommunikasjon, kompleksitetsforståelse og evne til å komme videre) retter forbedringsarbeidet mot de riktige områdene. Deretter går vi grundig gjennom håndtering av kanttilfeller og beste praksis for kommunikasjon som kandidat.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien DSA Interview Prep, inkludert «Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i DSA Interview Prep inneholder totalt 4 leksjoner.
Hva lærer jeg i «Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer»?
Løs tre problemer innen en tidsgrense på 45 minutter, forklar tankegangen høyt slik De ville gjort i et ekte intervju, og gå gjennom optimale løsninger etterpå. Du øver på DSA Interview Prep med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med DSA Interview Prep?
Ingen tidligere erfaring er nødvendig. DSA Interview Prep på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.
Hvor lang tid tar leksjonen «Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne DSA Interview Prep-leksjonen?
Ja. Alle DSA Interview Prep-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Hurtigguide til mønstergjenkjenning
- Tidsbegrenset prøveintervju: enkle og middels vanskelige problemer
- Håndtering av spesialtilfeller og kommunikasjon i intervjuet
- Gjennomgang av vanskelige problemer: Word Ladder II og Alien Dictionary