Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen
Los drie problemen op binnen een tijdslimiet van 45 minuten, verwoord uw denkproces zoals u dat in een echt interview zou doen en bekijk daarna optimale oplossingen.
Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Voorbereiding op programmeerinterviews. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Deze proefsollicitatie gebruiken
Deze les simuleert een echt technisch sollicitatiegesprek. Voor elke opgave moet je: (1) de opgave één keer lezen, (2) het patroon binnen 60 seconden herkennen, (3) je aanpak en complexiteit uitleggen, (4) de oplossing schrijven en (5) met voorbeelden testen. Stel een timer in. Een makkelijke opgave moet 10-15 minuten duren; een middelzware opgave 20-25 minuten.
Kijk niet vooruit naar de oplossing — daarmee haal je het doel onderuit. Als je na 5 minuten vastzit, lees je de probleembeschrijving opnieuw en zoek je naar het signaalwoord dat het patroon onthult (gesorteerd? minimum? alle combinaties? deelarray?). Het vermogen om jezelf weer op weg te helpen is net zo belangrijk als het vermogen om snel een oplossing te vinden.
# 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')Makkelijk probleem 1: geldige haakjes
Opgave: Gegeven een tekenreeks die alleen '(', ')', '{', '}', '[' en ']' bevat, bepaal je of de invoertekenreeks geldig is. Een tekenreeks is geldig als elk openingshaakje in de juiste volgorde door een haakje van hetzelfde type wordt gesloten.
Signaal: Overeenkomende paren, volgorde is belangrijk, het meest recente openingshaakje moet als eerste worden gesloten → Stack. Plaats openingshaakjes op de stack; haal ze eraf en controleer ze bij sluitingshaakjes. Als de stack leeg is wanneer je er een element uit probeert te halen, of aan het einde nog elementen bevat, is de tekenreeks ongeldig. Tijd O(n), ruimte 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})')Makkelijk probleem 2: beste moment om aandelen te kopen en verkopen
Opgave: Gegeven een array prices waarin prices[i] de aandelenprijs op dag i is, vind je de maximale winst uit één aankoop en één verkoop (je moet eerst kopen en daarna verkopen). Geef 0 terug als er geen winst mogelijk is.
Signaal: Maximaal verschil waarbij de linkerkant vóór de rechterkant moet komen → Houd het lopende minimum bij terwijl je van links naar rechts scant. Op elke dag is de mogelijke winst current_price - min_so_far. Werk de maximale winst bij. Dit is O(n)/O(1) en een speciaal geval van het algoritme van Kadane.
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})')Middelzwaar probleem 1: som van drie
Opgave: Gegeven een array, vind je alle unieke drietallen waarvan de som nul is. De oplossing mag geen dubbele drietallen bevatten.
Patroon: Twee aanwijzers, uitgebreid naar drie elementen. Sorteer de array. Gebruik voor elk element nums[i] twee aanwijzers left = i+1 en right = n-1 om paren te vinden waarvan de som -nums[i] is. Sla duplicaten over door voorbij identieke waarden te gaan. Tijd O(n²), ruimte O(1), exclusief de uitvoer. Door te sorteren wordt het afhandelen van duplicaten overzichtelijk.
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])) # []Gemiddeld probleem 2: Langste subtekenreeks zonder herhalende tekens
Probleem: Gegeven een tekenreeks, vind de lengte van de langste subtekenreeks zonder herhalende tekens.
Patroon: Schuivend venster met een verzameling (of een woordenboek met de laatste posities). Houd een venster [left, right] bij. Vergroot right door elk teken op te nemen. Als een teken opnieuw voorkomt (al in het venster staat), verklein je het venster vanaf links totdat het dubbele teken is verwijderd. Houd de grootst geziene venstergrootte bij. Tijd O(n), ruimte 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})')Gemiddeld probleem 3: Muntwisselprobleem
Probleem: Gegeven muntwaarden en een doelbedrag, vind het minimale aantal munten dat nodig is om het bedrag te bereiken. Geef -1 terug als dat onmogelijk is.
Patroon: Klassieke 1D-DP (variant van het onbeperkte-rugzakprobleem). dp[i] = het minimale aantal munten voor bedrag i. Initialiseer dp[0] = 0 en alle andere waarden op oneindig. Probeer voor elk bedrag van 1 tot target alle muntwaarden. dp[i] = min(dp[i], dp[i - coin] + 1) voor elke geldige munt. Tijd O(amount × len(coins)), ruimte 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})')Probleemoplossingswerkwijze onder tijdsdruk
Wanneer de tijd bijna om is, geef dan prioriteit aan deze volgorde: (1) een werkende oplossing die alle mogelijkheden uitprobeert en correcte uitvoer oplevert boven een onvolledige optimale oplossing, (2) handel randgevallen zichtbaar af, (3) schrijf schone, leesbare code in plaats van slimme eenregelige oplossingen. Interviewers geven de voorkeur aan een overzichtelijke O(n²)-oplossing die alle testgevallen doorstaat boven een O(n)-oplossing met een subtiele fout.
Als je beseft dat je O(n²)-oplossing niet klopt, laat die dan niet halverwege vallen — maak haar af, test haar en bied vervolgens aan haar te optimaliseren als er tijd over is. Een halfgeschreven optimale oplossing levert minder waardering op dan een complete maar niet-optimale oplossing.
# 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 []Je oplossing nakijken: vijf vragen
Stel jezelf deze vijf vragen voordat je zegt: 'Ik ben klaar':
- Kan de oplossing lege invoer verwerken?
[],'',None, n=0 - Kan de oplossing één element verwerken? Arrays met grootte 1, bomen met één knooppunt
- Kan de oplossing elementen verwerken die allemaal hetzelfde zijn?
[5, 5, 5, 5],'aaaa' - Kan de oplossing minimum- en maximumwaarden verwerken? Negatieve getallen, zeer grote gehele getallen, 0
- Heb ik de tijd- en ruimtecomplexiteit vermeld? Big-O met een korte onderbouwing
Deze vijf controles vangen de meeste fouten in oplossingen voor programmeerinterviews op. Interviewers verwachten dat kandidaten zichzelf testen — ze zullen je niet vertellen dat je oplossing een fout bevat tenzij je om feedback vraagt.
# 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})')Omgaan met vervolgvragen
Nadat je het probleem hebt opgelost, stellen interviewers doorgaans vervolgvragen. Veelvoorkomende typen zijn:
- 'Kun je dit met O(1) ruimte doen?' → Zoek naar wijzigingen ter plaatse of wiskundige trucs
- 'Wat als n heel groot is?' → Bespreek verwerking in stromen, paginering of steekproefmethoden
- 'Wat als de array al gesorteerd is?' → Vaak bestaat er een eenvoudiger algoritme
- 'Kun je dit parallel uitvoeren?' → Identificeer onafhankelijke deelproblemen en bespreek MapReduce of parallelle taakverwerking
Vervolgvragen testen diepgang en aanpassingsvermogen. Zeg: 'Laat me even nadenken' in plaats van meteen te gokken. Een bedachtzame pauze is beter dan een fout antwoord dat zelfverzekerd wordt gegeven.
# 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')Oefenprobleem: anagrammen groeperen
Probleem: Gegeven een array met tekenreeksen, groepeer de anagrammen bij elkaar. Geef een lijst met groepen terug.
Patroon: Een frequentiemap als sleutel. Sorteer voor elke tekenreeks de tekens (of bereken een tupel met tekenfrequenties) als canonieke sleutel. Groepeer tekenreeksen op basis van deze sleutel met een hashtabel met lijsten. Tijd O(n × m log m), waarbij m de maximale lengte van een tekenreeks is, ruimte O(n × m). Er zijn geen geneste lussen nodig — één doorgang door de array.
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)])Zelfevaluatie na een oefeninterview
Evalueer jezelf na elk oefeninterview op deze aspecten:
- Snelheid van patroonherkenning: Heb je het patroon binnen <60 seconden herkend?
- Correctheid van de code: Doorstond je eerste oplossing alle testgevallen?
- Omgaan met randgevallen: Heb je lege invoer, invoer met één element en extreme invoer getest?
- Communicatie: Heb je je redenering voortdurend uitgelegd?
- Bewustzijn van complexiteit: Heb je de tijd- en ruimtecomplexiteit vermeld?
- Herstel: Als je vastliep, schakelde je soepel over of blokkeerde je?
Geef jezelf per aspect een score van 1 tot 5. Richt je oefening in de komende week op het aspect met de laagste score. De meeste kandidaten moeten óf hun patroonherkenning óf hun communicatie verbeteren — zelden beide.
# 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 scoresKorte controle
Toets je begrip van de concepten uit de les Data Structures & Algorithms — Coding Interview Prep.
Samenvatting van de les
In deze les heb je geleerd: een vaste werkwijze voor problemen hanteren — lees de opgave, herken het patroon binnen 60 seconden, vermeld de complexiteit, schrijf de code en test die vervolgens met vijf categorieën randgevallen, een werkende oplossing die alle mogelijkheden uitprobeert is beter dan een onvolledige optimale oplossing wanneer de tijd bijna om is, en zelfevaluatie na elke oefensessie met een oefeninterview op zes aspecten (snelheid, correctheid, randgevallen, communicatie, complexiteit, herstel) richt je verbetering op de juiste gebieden. Hierna behandelen we het omgaan met randgevallen en de beste werkwijzen voor communicatie als kandidaat uitgebreid.
Leer Voorbereiding op programmeerinterviews met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 90
- Lessen
- 360
Veelgestelde vragen
Is de les “Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen” gratis?
Ja — de volledige tekst van “Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Voorbereiding op programmeerinterviews wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Voorbereiding op programmeerinterviews bevat in totaal 4 lessen.
Wat leer ik in “Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen”?
Los drie problemen op binnen een tijdslimiet van 45 minuten, verwoord uw denkproces zoals u dat in een echt interview zou doen en bekijk daarna optimale oplossingen. Je oefent met Voorbereiding op programmeerinterviews door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met Voorbereiding op programmeerinterviews te beginnen?
Ervaring vooraf is niet nodig. Voorbereiding op programmeerinterviews op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over Voorbereiding op programmeerinterviews?
Ja. Elke les over Voorbereiding op programmeerinterviews bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Spiekbrief voor patroonherkenning
- Proefinterview met tijdslimiet: eenvoudige en gemiddelde problemen
- Randgevallen en communicatie met de interviewer
- Uitwerkingen van moeilijke problemen: Word Ladder II en Alien Dictionary