Tidsbegränsad övningsintervju: enkla och medelsvåra problem
Lös tre problem inom 45 minuter, beskriv era tankegångar högt som under en riktig intervju och gå därefter igenom optimala lösningar.
Tidsbegränsad övningsintervju: enkla och medelsvåra problem är en gratis lektion i DSA Interview Prep på CoddyKit. Detta är lektion 2 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för DSA Interview Prep, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i DSA Interview Prep innehåller totalt 4 lektioner.
Så använder du den här övningsintervjun
Den här lektionen simulerar ett riktigt kodningsintervjutillfälle. För varje problem bör du: (1) läsa det en gång, (2) identifiera mönstret inom 60 sekunder, (3) ange din metod och komplexitet, (4) skriva lösningen och (5) testa med exempel. Ställ en timer. Ett enkelt problem bör ta 10–15 minuter och ett medelsvårt problem 20–25 minuter.
Titta inte på lösningen i förväg – då försvinner syftet. Om du har fastnat efter 5 minuter ska du läsa problemformuleringen igen och leta efter signalordet som avslöjar mönstret (sorterad? minimum? alla kombinationer? delarray?). Förmågan att själv komma vidare när du har fastnat är lika viktig som förmågan att lösa problemet snabbt.
# 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')Enkelt problem 1: Giltiga parenteser
Problem: Givet en sträng som endast innehåller '(', ')', '{', '}', '[', ']', avgör om indatasträngen är giltig. En sträng är giltig om varje öppningsparentes stängs av samma typ av parentes i rätt ordning.
Signal: Matchande par, ordningen spelar roll och den senast öppnade parentesen måste stängas först → Stack. Lägg öppningsparenteser på stacken; gör pop och verifiera vid stängande parenteser. Om stacken är tom när vi försöker göra pop, eller om det finns element kvar i slutet, är strängen ogiltig. Tid O(n), utrymme 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})')Enkelt problem 2: Bästa tiden att köpa och sälja aktier
Problem: Givet en array prices där prices[i] är aktiekursen dag i, hitta den maximala vinsten från ett köp och en försäljning (köpet måste ske före försäljningen). Returnera 0 om ingen vinst är möjlig.
Signal: Maximal skillnad där vänsterledet måste föregå högerledet → Håll reda på det lägsta värdet hittills när du går från vänster till höger. Varje dag är den möjliga vinsten current_price - min_so_far. Uppdatera den maximala vinsten. Detta är O(n)/O(1) och ett specialfall 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})')Medelsvårt problem 1: Three Sum
Problem: Givet en array, hitta alla unika tripplar vars summa är noll. Lösningen får inte innehålla duplicerade tripplar.
Mönster: Two-pointer utvidgat till tre element. Sortera arrayen. För varje element nums[i] använder du två pekare left = i+1, right = n-1 för att hitta par vars summa är -nums[i]. Hoppa över dubbletter genom att flytta förbi identiska värden. Tid O(n²), utrymme O(1) bortsett från resultatet. Sorteringen gör hanteringen av dubbletter enkel.
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])) # []Medelsvårt problem 2: Längsta delsträng utan upprepade tecken
Problem: Givet en sträng, hitta längden på den längsta delsträngen utan upprepade tecken.
Mönster: Glidande fönster med en mängd (eller en dict över de senaste positionerna). Upprätthåll ett fönster [left, right]. Utöka right genom att inkludera varje tecken. Om ett tecken upprepas (redan finns i fönstret), krymper du fönstret från vänster tills dubbletten har tagits bort. Håll reda på den största fönsterstorleken hittills. Tid O(n), utrymme 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})')Medelsvårt problem 3: Myntväxling
Problem: Givet ett antal myntvalörer och ett målvärde, hitta det minsta antalet mynt som behövs för att nå beloppet. Returnera -1 om det är omöjligt.
Mönster: Klassisk endimensionell DP (en variant av det obundna ryggsäcksproblemet). dp[i] = det minsta antalet mynt för beloppet i. Initiera dp[0] = 0 och alla övriga till oändlighet. För varje belopp från 1 till target provar du alla myntvalörer. dp[i] = min(dp[i], dp[i - coin] + 1) för varje giltigt mynt. Tid O(amount × len(coins)), utrymme 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})')Problemlösningsprocess under tidspress
När tiden håller på att ta slut bör du prioritera i följande ordning: (1) en fungerande brute force-lösning med korrekt resultat framför en ofullständig optimal lösning, (2) hantera kantfall på ett tydligt sätt, (3) skriv ren och lättläst kod i stället för smarta one-liners. Intervjuare föredrar en ren O(n²)-lösning som klarar alla testfall framför en O(n)-lösning med ett svårupptäckt fel.
Om du inser att din O(n²)-lösning är fel ska du inte överge den halvvägs – slutför den, testa den och erbjud dig sedan att optimera den om tiden räcker. En halvskriven optimal lösning ger mindre utdelning än en komplett men suboptimal 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 []Granska din lösning: fem frågor
Innan du säger 'Jag är klar' bör du ställa dig själv dessa fem frågor:
- Hanterar den tom indata?
[],'',None, n=0 - Hanterar den ett enda element? Arrayer med storlek 1, träd med en nod
- Hanterar den element som alla är likadana?
[5, 5, 5, 5],'aaaa' - Hanterar den minimi- och maximivärden? Negativa tal, mycket stora heltal, 0
- Har jag angett tids- och utrymmeskomplexiteten? Big-O med en kort motivering
Dessa fem kontroller fångar de flesta buggar i intervjulösningar. Intervjuare förväntar sig att kandidater testar sina lösningar själva – de kommer inte att berätta att lösningen innehåller en bugg om du inte ber om feedback.
# 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})')Hantera följdfrågor
När du har löst problemet ställer intervjuare vanligtvis följdfrågor. Vanliga typer är:
- 'Kan du göra det med O(1) utrymme?' → Leta efter modifiering på plats eller matematiska trick
- 'Vad händer om n är mycket stort?' → Diskutera metoder med strömning, paginering eller sampling
- 'Vad händer om arrayen redan är sorterad?' → Det finns ofta en enklare algoritm
- 'Kan du parallellisera detta?' → Identifiera oberoende delproblem och diskutera MapReduce eller uppgiftsparallellism
Följdfrågor testar djup och anpassningsförmåga. Säg 'Låt mig tänka en stund' i stället för att omedelbart gissa. En eftertänksam paus är bättre än ett självsäkert men felaktigt svar.
# 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')Övningsproblem: Gruppera anagram
Problem: Givet en array med strängar, gruppera anagrammen tillsammans. Returnera en lista med grupper.
Mönster: Frekvenskarta som nyckel. För varje sträng sorterar du dess tecken (eller beräknar en tupel med teckenfrekvenser) som den kanoniska nyckeln. Gruppera strängarna efter denna nyckel med hjälp av en hashkarta med listor. Tid O(n × m log m), där m är den maximala stränglängden, utrymme O(n × m). Inga nästlade loopar behövs – ett enda genomlopp av arrayen.
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)])Självutvärdering efter en övningsintervju
Efter varje övningsintervju bör du utvärdera dig själv utifrån följande områden:
- Hastighet i mönsterigenkänning: Identifierade du mönstret på <60 sekunder?
- Kodens korrekthet: Klarade din första lösning alla testfall?
- Hantering av kantfall: Testade du tom, enkel och extrem indata?
- Kommunikation: Förklarade du ditt resonemang under hela processen?
- Komplexitetsmedvetenhet: Angav du tids- och utrymmeskomplexiteten?
- Återhämtning: Om du fastnade, bytte du metod på ett smidigt sätt eller låste du dig?
Ge dig själv ett betyg från 1 till 5 inom varje område. Fokusera nästa veckas övning på det område som fick lägst betyg. De flesta kandidater behöver förbättra antingen mönsterigenkänning eller kommunikation – sällan båda.
# 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 scoresSnabbtest
Testa din förståelse av koncepten i Data Structures & Algorithms — Coding Interview Prep från den här lektionen.
Lektionssammanfattning
I den här lektionen lärde du dig: att angripa problem med ett fast arbetsflöde – läs, identifiera mönstret på 60 sekunder, ange komplexiteten, koda och testa sedan med fem kategorier av kantfall, att en fungerande brute force-lösning slår en ofullständig optimal lösning när tiden håller på att ta slut och att självutvärdering efter varje övningsintervju utifrån sex områden (snabbhet, korrekthet, kantfall, kommunikation, komplexitet, återhämtning) riktar förbättringsarbetet mot rätt områden. Nästa avsnitt handlar mer ingående om att hantera kantfall och bästa praxis för intervjukandidatens kommunikation.
Lär dig Python med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 30
- Lektioner
- 120
Vanliga frågor
Är lektionen ”Tidsbegränsad övningsintervju: enkla och medelsvåra problem” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen DSA Interview Prep, inklusive ”Tidsbegränsad övningsintervju: enkla och medelsvåra problem”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i DSA Interview Prep innehåller totalt 4 lektioner.
Vad lär jag mig i ”Tidsbegränsad övningsintervju: enkla och medelsvåra problem”?
Lös tre problem inom 45 minuter, beskriv era tankegångar högt som under en riktig intervju och gå därefter igenom optimala lösningar. Ni övar på DSA Interview Prep med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig DSA Interview Prep?
Du behöver inga förkunskaper. Utbildningen i DSA Interview Prep på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 2 av 4.
Hur lång tid tar lektionen ”Tidsbegränsad övningsintervju: enkla och medelsvåra problem”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här DSA Interview Prep-lektionen?
Ja. Varje DSA Interview Prep-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Fuskblad för mönsterigenkänning
- Tidsbegränsad övningsintervju: enkla och medelsvåra problem
- Hantering av specialfall och kommunikation under intervjun
- Genomgång av svåra problem: Word Ladder II och Alien Dictionary