Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben
Lösen Sie drei Aufgaben unter einem 45-Minuten-Zeitlimit, erläutern Sie Ihren Denkprozess wie in einem echten Interview und sehen Sie sich anschließend optimale Lösungen an.
Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben ist eine kostenlose DSA Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des DSA Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der DSA Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
So verwenden Sie dieses Probeinterview
Diese Lektion simuliert eine echte Coding-Interview-Sitzung. Für jedes Problem sollten Sie: (1) es einmal lesen, (2) innerhalb von 60 Sekunden das Muster identifizieren, (3) Ihren Ansatz und dessen Komplexität nennen, (4) die Lösung schreiben und (5) sie anhand von Beispielen testen. Stellen Sie einen Timer. Ein einfaches Problem sollte 10–15 Minuten dauern, ein mittelschweres 20–25 Minuten.
Schauen Sie nicht vorab in die Lösung — sonst verfehlt die Übung ihren Zweck. Wenn Sie nach 5 Minuten nicht weiterkommen, lesen Sie die Problembeschreibung erneut und suchen Sie nach dem Signalwort, das das Muster erkennen lässt (sortiert? Minimum? alle Kombinationen? Teilarray?). Die Fähigkeit, sich selbst aus einer Sackgasse zu befreien, ist ebenso wichtig wie die Fähigkeit, Probleme schnell zu lösen.
# 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')Einfaches Problem 1: Gültige Klammern
Problem: Gegeben sei eine Zeichenkette, die nur '(', ')', '{', '}', '[' und ']' enthält. Bestimmen Sie, ob die Eingabezeichenkette gültig ist. Eine Zeichenkette ist gültig, wenn jede öffnende Klammer in der richtigen Reihenfolge durch eine schließende Klammer desselben Typs geschlossen wird.
Signal: Passende Paare, die Reihenfolge ist entscheidend, die zuletzt geöffnete Klammer muss zuerst geschlossen werden → Stack. Legen Sie öffnende Klammern auf den Stack; nehmen Sie sie bei schließenden Klammern herunter und überprüfen Sie sie. Wenn der Stack beim Entfernen leer ist oder am Ende noch Elemente enthält, ist die Zeichenkette ungültig. Zeit O(n), Speicher 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})')Einfaches Problem 2: Bester Zeitpunkt zum Kauf und Verkauf von Aktien
Problem: Gegeben sei ein Array prices, wobei prices[i] den Aktienkurs am Tag i angibt. Finden Sie den maximalen Gewinn aus einem Kauf und einem Verkauf (der Kauf muss vor dem Verkauf erfolgen). Geben Sie 0 zurück, wenn kein Gewinn möglich ist.
Signal: Maximale Differenz, bei der der linke Index vor dem rechten liegen muss → Verfolgen Sie beim Durchlaufen von links nach rechts das bisherige Minimum. An jedem Tag ist der potenzielle Gewinn current_price - min_so_far. Aktualisieren Sie den maximalen Gewinn. Dies ist O(n)/O(1) und ein Sonderfall des Kadane-Algorithmus.
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})')Mittleres Problem 1: Dreiersumme
Problem: Gegeben sei ein Array. Finden Sie alle eindeutigen Tripel, deren Summe null ergibt. Die Lösung darf keine doppelten Tripel enthalten.
Muster: Zwei-Zeiger-Verfahren, erweitert auf drei Elemente. Sortieren Sie das Array. Verwenden Sie für jedes Element nums[i] zwei Zeiger left = i+1 und right = n-1, um Paare zu finden, deren Summe -nums[i] ergibt. Überspringen Sie Duplikate, indem Sie über identische Werte hinweg weitergehen. Zeit O(n²), Speicher O(1) ohne die Ausgabe. Durch das Sortieren lassen sich Duplikate problemlos behandeln.
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])) # []Aufgabe mittleren Schwierigkeitsgrads 2: Längste Teilzeichenkette ohne wiederholte Zeichen
Aufgabe: Gegeben ist eine Zeichenkette. Finden Sie die Länge der längsten Teilzeichenkette ohne wiederholte Zeichen.
Muster: Sliding Window mit einer Menge (oder einem Dictionary der letzten Positionen). Verwalten Sie ein Fenster [left, right]. Erweitern Sie right, indem Sie jedes Zeichen aufnehmen. Wenn ein Zeichen wiederholt vorkommt (also bereits im Fenster enthalten ist), verkleinern Sie das Fenster von links, bis das doppelte Zeichen entfernt wurde. Speichern Sie die bisher beobachtete maximale Fenstergröße. Zeitkomplexität O(n), Speicherkomplexität 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})')Aufgabe mittleren Schwierigkeitsgrads 3: Münzwechselproblem
Aufgabe: Gegeben sind Münzwerte und ein Zielbetrag. Finden Sie die minimale Anzahl an Münzen, die benötigt wird, um den Betrag zu erreichen. Geben Sie -1 zurück, wenn dies nicht möglich ist.
Muster: Klassische eindimensionale dynamische Programmierung (Variante des unbeschränkten Rucksackproblems). dp[i] = minimale Anzahl an Münzen für den Betrag i. Initialisieren Sie dp[0] = 0 und alle anderen Werte mit Unendlich. Probieren Sie für jeden Betrag von 1 bis zum Zielbetrag alle Münzwerte aus. Für jede gültige Münze gilt dp[i] = min(dp[i], dp[i - coin] + 1). Zeitkomplexität O(amount × len(coins)), Speicherkomplexität 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ösungs-Workflow unter Zeitdruck
Wenn die Zeit knapp wird, priorisieren Sie in dieser Reihenfolge: (1) eine funktionierende Brute-Force-Lösung mit korrekter Ausgabe statt einer unvollständigen optimalen Lösung, (2) Randfälle sichtbar behandeln, (3) sauberen, gut lesbaren Code statt cleverer Einzeiler schreiben. Interviewer bevorzugen eine saubere O(n²)-Lösung, die alle Testfälle besteht, gegenüber einer O(n)-Lösung mit einem schwer erkennbaren Fehler.
Wenn Sie feststellen, dass Ihre O(n²)-Lösung fehlerhaft ist, geben Sie sie nicht mitten in der Bearbeitung auf – stellen Sie sie fertig, testen Sie sie und bieten Sie anschließend an, sie zu optimieren, falls noch Zeit bleibt. Eine halb fertiggestellte optimale Lösung bringt weniger Anerkennung als eine vollständige, aber nicht optimale Lösung.
# 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 []Ihre Lösung überprüfen: fünf Fragen
Bevor Sie sagen: „Ich bin fertig“, stellen Sie sich diese fünf Fragen:
- Verarbeitet die Lösung eine leere Eingabe?
[],'',None, n=0 - Verarbeitet die Lösung ein einzelnes Element? Arrays der Größe 1, Bäume mit einem Knoten
- Verarbeitet die Lösung ausschließlich gleiche Elemente?
[5, 5, 5, 5],'aaaa' - Verarbeitet die Lösung minimale und maximale Werte? Negative Zahlen, sehr große Ganzzahlen, 0
- Habe ich die Zeit- und Speicherkomplexität angegeben? Big-O mit einer kurzen Begründung
Diese fünf Prüfungen finden die Mehrzahl der Fehler in Lösungen für Vorstellungsgespräche. Interviewer erwarten, dass Kandidaten ihre Lösungen selbst testen – sie werden Ihnen nicht sagen, dass Ihre Lösung einen Fehler enthält, wenn Sie nicht um Feedback bitten.
# 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})')Mit Nachfragen umgehen
Nachdem Sie die Aufgabe gelöst haben, stellen Interviewer typischerweise Nachfragen. Häufige Arten sind:
- „Können Sie das mit O(1) Speicher lösen?“ → Suchen Sie nach einer Änderung direkt in den Eingabedaten oder nach mathematischen Tricks
- „Was ist, wenn n sehr groß ist?“ → Besprechen Sie Ansätze mit Datenströmen, Paginierung oder Stichproben
- „Was ist, wenn das Array bereits sortiert ist?“ → Häufig gibt es einen einfacheren Algorithmus
- „Können Sie das parallelisieren?“ → Identifizieren Sie unabhängige Teilprobleme und besprechen Sie MapReduce oder Aufgabenparallelität
Nachfragen prüfen die Tiefe Ihres Wissens und Ihre Anpassungsfähigkeit. Sagen Sie lieber: „Lassen Sie mich kurz darüber nachdenken“, statt sofort zu raten. Eine überlegte Pause ist besser als eine selbstbewusst vorgetragene falsche Antwort.
# 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')Übungsaufgabe: Anagramme gruppieren
Aufgabe: Gegeben ist ein Array aus Zeichenketten. Gruppieren Sie die Anagramme. Geben Sie eine Liste von Gruppen zurück.
Muster: Eine Häufigkeitszuordnung als Schlüssel. Sortieren Sie für jede Zeichenkette ihre Zeichen (oder berechnen Sie ein Zeichenhäufigkeits-Tupel) als kanonischen Schlüssel. Gruppieren Sie Zeichenketten anhand dieses Schlüssels mithilfe einer Hashmap aus Listen. Zeitkomplexität O(n × m log m), wobei m die maximale Länge einer Zeichenkette ist, Speicherkomplexität O(n × m). Verschachtelte Schleifen sind nicht erforderlich – durchlaufen Sie das Array in einem einzigen Durchgang.
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)])Selbsteinschätzung nach einem Probeinterview
Bewerten Sie sich nach jedem Probeinterview anhand dieser Dimensionen:
- Geschwindigkeit der Mustererkennung: Haben Sie das Muster in <60 Sekunden erkannt?
- Korrektheit des Codes: Hat Ihre erste Lösung alle Testfälle bestanden?
- Umgang mit Randfällen: Haben Sie leere, einzelne und extreme Eingaben getestet?
- Kommunikation: Haben Sie Ihre Überlegungen durchgehend erklärt?
- Komplexitätsbewusstsein: Haben Sie die Zeit- und Speicherkomplexität angegeben?
- Umgang mit Rückschlägen: Sind Sie bei Schwierigkeiten souverän auf einen anderen Ansatz umgeschwenkt oder haben Sie blockiert?
Bewerten Sie sich in jeder Dimension auf einer Skala von 1 bis 5. Richten Sie Ihre Übungen in der nächsten Woche auf die am niedrigsten bewertete Dimension aus. Die meisten Kandidaten müssen entweder ihre Mustererkennung oder ihre Kommunikation verbessern – nur selten beides.
# 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 scoresSchnelltest
Testen Sie Ihr Verständnis der Konzepte aus Data Structures & Algorithms — Coding Interview Prep in dieser Lektion.
Zusammenfassung der Lektion
In dieser Lektion haben Sie Folgendes gelernt: Gehen Sie Aufgaben nach einem festen Workflow an – lesen Sie die Aufgabe, erkennen Sie das Muster in 60 Sekunden, geben Sie die Komplexität an, programmieren Sie und testen Sie anschließend anhand von fünf Randfallkategorien, eine funktionierende Brute-Force-Lösung ist bei knapper Zeit besser als eine unvollständige optimale Lösung und eine Selbsteinschätzung nach jeder Probeübung anhand von sechs Dimensionen (Geschwindigkeit, Korrektheit, Randfälle, Kommunikation, Komplexität und Umgang mit Rückschlägen) hilft Ihnen, die richtigen Bereiche gezielt zu verbessern. Als Nächstes behandeln wir den Umgang mit Randfällen und bewährte Vorgehensweisen für die Kommunikation von Bewerbenden ausführlich.
Häufig gestellte Fragen
Ist die Lektion „Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben“ kostenlos?
Ja — der vollständige Text von „Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des DSA Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der DSA Interview Prep-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben“?
Lösen Sie drei Aufgaben unter einem 45-Minuten-Zeitlimit, erläutern Sie Ihren Denkprozess wie in einem echten Interview und sehen Sie sich anschließend optimale Lösungen an. Du übst DSA Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um DSA Interview Prep zu starten?
Keine Vorkenntnisse erforderlich. DSA Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser DSA Interview Prep-Lektion Code schreiben und ausführen?
Ja. Jede DSA Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Spickzettel zur Mustererkennung
- Zeitlich begrenztes Probeinterview: einfache und mittelschwere Aufgaben
- Umgang mit Sonderfällen und Kommunikation im Interview
- Durchläufe schwieriger Aufgaben: Word Ladder II und Alien Dictionary