0Pricing
Coding Interview Prep · Ders

Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler

45 dakikalık süre içinde üç problem çözün, gerçek bir mülakatta yapacağınız gibi düşünce sürecinizi sözlü ifade edin ve ardından en iyi çözümleri gözden geçirin.

Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler, CoddyKit'te ücretsiz bir Coding Interview Prep dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Coding Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Coding Interview Prep kursu toplamda 4 dersten oluşur.

Bu Deneme Mülakatını Kullanma

Bu ders, gerçek bir kodlama mülakatı oturumunu simüle eder. Her problem için şunları yapmalısınız: (1) problemi bir kez okuyun, (2) örüntüyü 60 saniye içinde belirleyin, (3) yaklaşımınızı ve karmaşıklığı açıklayın, (4) çözümü yazın ve (5) örneklerle sınayın. Bir zamanlayıcı kurun. Kolay bir problem 10-15 dakika, orta zorluktaki bir problem ise 20-25 dakika sürmelidir.

Çözüme önceden bakmayın — bu, çalışmanın amacını ortadan kaldırır. 5 dakika sonra hâlâ takılırsanız problem ifadesini yeniden okuyun ve örüntüyü açığa çıkaran ipucu sözcüğünü arayın (sıralı mı? minimum mu? tüm birleşimler mi? alt dizi mi?). Kendi kendinize takıldığınız yerden çıkabilme becerisi, hızlı çözme becerisi kadar önemlidir.

# 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')

Kolay Problem 1: Geçerli Parantezler

Problem: Yalnızca '(', ')', '{', '}', '[', ']' karakterlerini içeren bir metin verildiğinde, girdi metninin geçerli olup olmadığını belirleyin. Bir metin, her açılan parantez doğru sırada aynı türden bir parantezle kapatılıyorsa geçerlidir.

İpucu: Eşleşen çiftler, sıranın önemli olması ve en son açılan parantezin önce kapanması → Yığın. Açılan parantezleri yığına itin; kapanan parantezlerde bir öğe çıkarıp doğrulayın. Çıkarmaya çalıştığınızda yığın boşsa veya sonunda yığında öğeler kalmışsa metin geçersizdir. Zaman O(n), Alan 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})')

Kolay Problem 2: Hisse Senedi Alıp Satmak İçin En Uygun Zaman

Problem: prices[i] değerinin i. gündeki hisse senedi fiyatı olduğu bir prices dizisi verildiğinde, tek bir alım ve satımdan elde edilebilecek maksimum kârı bulun (önce satın almanız, sonra satmanız gerekir). Kâr elde edilemiyorsa 0 döndürün.

İpucu: Sol konumun sağ konumdan önce gelmesi gereken maksimum fark → Soldan sağa tarama yaparken şimdiye kadarki minimumu izleyin. Her gün olası kâr current_price - min_so_far değeridir. Maksimum kârı güncelleyin. Bu çözüm O(n)/O(1) karmaşıklığındadır ve Kadane algoritmasının özel bir durumudur.

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})')

Orta Zorlukta Problem 1: Üçlü Toplam

Problem: Bir dizi verildiğinde toplamı sıfır olan tüm benzersiz üçlüleri bulun. Çözüm yinelenen üçlüler içermemelidir.

Örüntü: İki işaretçinin üç öğeye genişletilmiş kullanımı. Diziyi sort işlemiyle sıralayın. Her nums[i] öğesi için, toplamı -nums[i] olan çiftleri bulmak üzere left = i+1 ve right = n-1 işaretçilerini kullanın. Aynı değerleri atlayarak yinelenenleri geçin. Zaman O(n²), çıktı hariç Alan O(1). sort işlemi, yinelenen değerlerin yönetimini kolaylaştırır.

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]))           # []

Orta Düzey Problem 2: Tekrarlanmayan En Uzun Alt Dize

Problem: Bir dize verildiğinde, yinelenen karakterler içermeyen en uzun alt dizenin uzunluğunu bulun.

Örüntü: Bir kümeyle (veya son konumların sözlüğüyle) kayan pencere kullanın. [left, right] aralığında bir pencere tutun. Her karakteri dahil ederek pencereyi sağa doğru genişletin. Bir karakter yinelenirse (zaten pencerenin içindeyse), yinelenen karakter kaldırılana kadar sol taraftan daraltın. Görülen en büyük pencere boyutunu izleyin. Zaman O(n), alan O(n) ile alfabe boyutunun küçüğü kadardır.

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})')

Orta Düzey Problem 3: Madeni Para Değişimi

Problem: Madeni para değerleri ve bir hedef miktar verildiğinde, bu miktara ulaşmak için gereken en az madeni para sayısını bulun. Mümkün değilse -1 döndürün.

Örüntü: Klasik tek boyutlu DP (sınırsız sırt çantası çeşidi). dp[i] = i miktarı için gereken en az madeni para sayısı. dp[0] = 0 olarak başlatın, diğer tüm değerleri sonsuz yapın. 1'den hedef miktara kadar her miktar için tüm madeni para değerlerini deneyin. Her geçerli madeni para için dp[i] = min(dp[i], dp[i - coin] + 1). Zaman O(miktar × madeni para sayısı), alan O(miktar).

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})')

Zaman Baskısı Altında Problem Çözme İş Akışı

Zamanınız azalırken şu sıraya öncelik verin: (1) tamamlanmamış en iyi çözüm yerine doğru çıktı üreten çalışan bir kaba kuvvet çözümü, (2) sınır durumlarını açıkça ele almak, (3) zekice görünen tek satırlık çözümler yerine temiz ve okunabilir kod yazmak. Görüşmeciler, tüm sınama durumlarını geçen temiz bir O(n²) çözümü, ince bir hata içeren O(n) çözüme tercih eder.

O(n²) çözümünüzün yanlış olduğunu fark ederseniz, çözümü yarıda bırakmayın — tamamlayın, sınayın ve zaman kalırsa iyileştirmeyi önerin. Yarım bırakılmış en iyi çözüm, tamamlanmış ancak en iyi olmayan bir çözümden daha az takdir görür.

# 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 []

Çözümünüzü Gözden Geçirme: Beş Soru

'Bitti' demeden önce kendinize şu beş soruyu sorun:

  1. Boş girdiyi ele alıyor mu? [], '', None, n=0
  2. Tek bir öğeyi ele alıyor mu? Boyutu 1 olan diziler, tek düğümlü ağaçlar
  3. Tüm öğelerin aynı olması durumunu ele alıyor mu? [5, 5, 5, 5], 'aaaa'
  4. En küçük ve en büyük değerleri ele alıyor mu? Negatif sayılar, çok büyük tam sayılar, 0
  5. Zaman ve alan karmaşıklığını belirttim mi? Kısa bir gerekçeyle Big-O

Bu beş kontrol, mülakat çözümlerindeki hataların çoğunu yakalar. Görüşmeciler adayların kendi çözümlerini sınamasını bekler — siz geri bildirim istemedikçe çözümünüzde hata olduğunu söylemezler.

# 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})')

Takip Sorularını Ele Alma

Problemi çözdükten sonra görüşmeciler genellikle takip soruları sorar. Yaygın türler şunlardır:

  • 'Bunu O(1) alan kullanarak yapabilir misiniz?' → Yerinde değiştirme veya matematiksel yöntemler arayın
  • 'n çok büyükse ne olur?' → Akış işleme, sayfalandırma veya örnekleme yaklaşımlarını tartışın
  • 'Dizi zaten sıralıysa ne olur?' → Genellikle daha basit bir algoritma vardır
  • 'Bunu paralel hâle getirebilir misiniz?' → Birbirinden bağımsız alt problemleri belirleyin ve MapReduce veya görev paralelliğini tartışın

Takip soruları, konuya hâkimiyetinizi ve uyum sağlama yeteneğinizi sınar. Hemen tahminde bulunmak yerine 'Bir an düşünmeme izin verin' deyin. Düşünerek verilen kısa bir ara, kendinden emin biçimde verilen yanlış bir yanıttan daha iyidir.

# 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')

Alıştırma Problemi: Anagramları Gruplama

Problem: Dizelerden oluşan bir dizi verildiğinde, anagramları birlikte gruplayın. Grupların listesini döndürün.

Örüntü: Anahtar olarak frekans eşlemesi kullanın. Her dize için karakterlerini sort edin (veya karakter frekanslarından oluşan bir demet hesaplayın) ve bunu standart anahtar olarak kullanın. Dizeleri, listelerden oluşan bir karma eşleme kullanarak bu anahtara göre gruplayın. Zaman, m en uzun dize uzunluğu olmak üzere O(n × m log m), alan O(n × m). İç içe döngülere gerek yoktur — dizi üzerinden tek geçiş yeterlidir.

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)])

Deneme Mülakatı Sonrası Öz Değerlendirme

Her deneme mülakatından sonra kendinizi şu boyutlarda değerlendirin:

  • Örüntüyü tanıma hızı: Örüntüyü 60 saniyeden kısa sürede belirlediniz mi?
  • Kodun doğruluğu: İlk çözümünüz tüm sınama durumlarını geçti mi?
  • Sınır durumlarını ele alma: Boş, tek öğeli ve uç değerli girdileri sınadınız mı?
  • İletişim: Akıl yürütmenizi süreç boyunca açıkladınız mı?
  • Karmaşıklık farkındalığı: Zaman ve alan karmaşıklığını belirttiniz mi?
  • Toparlanma: Takıldığınızda zarifçe yön değiştirdiniz mi, yoksa donup kaldınız mı?

Her boyuta 1-5 arasında puan verin. Gelecek haftaki alıştırmalarınızı en düşük puanı verdiğiniz boyuta odaklayın. Adayların çoğunun örüntü tanıma veya iletişim becerisini geliştirmesi gerekir — ikisini birden geliştirmeleri nadirdir.

# 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 scores

Hızlı Kontrol

Bu dersteki Veri Yapıları ve Algoritmalar — Kodlama Mülakatına Hazırlık kavramlarını anlayıp anlamadığınızı sınayın.

Ders Özeti

Bu derste şunları öğrendiniz: problemlere sabit bir iş akışıyla yaklaşmayı — okuyun, 60 saniye içinde örüntüyü belirleyin, karmaşıklığı belirtin, kod yazın ve ardından beş sınır durumu kategorisiyle sınayın, zaman azalırken çalışan bir kaba kuvvet çözümünün tamamlanmamış en iyi çözümden daha iyi olduğunu ve her deneme çalışmasından sonra altı boyutta (hız, doğruluk, sınır durumları, iletişim, karmaşıklık, toparlanma) yapılan öz değerlendirmenin gelişimi doğru alanlara odakladığını öğrendiniz. Sırada sınır durumlarını ele almayı ve mülakata giren kişinin iletişimi için en iyi uygulamaları ayrıntılı biçimde inceleyeceğiz.

Sıkça Sorulan Sorular

“Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler” dersi ücretsiz mi?

Evet — “Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Coding Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Coding Interview Prep kursu toplamda 4 dersten oluşur.

“Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler” dersinde ne öğreneceğim?

45 dakikalık süre içinde üç problem çözün, gerçek bir mülakatta yapacağınız gibi düşünce sürecinizi sözlü ifade edin ve ardından en iyi çözümleri gözden geçirin. Coding Interview Prep ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

Coding Interview Prep öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te Coding Interview Prep, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.

“Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu Coding Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her Coding Interview Prep dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Örüntü Tanıma Kopya Kâğıdı
  2. Süreli Deneme Mülakatı: Kolay ve Orta Düzey Problemler
  3. Kenar Durumlarını Ele Alma ve Mülakatçıyla İletişim
  4. Zor Problem Çözümleri: Sözcük Merdiveni II ve Uzaylı Sözlüğü
← Coding Interview Prep Sayfasına Dön