Ana içeriğe geç
Kesit Python
İleri · Mülakat

Mülakat hazırlığı: Python soruları, algoritmalar, canlı kodlama

Teknik mülakatlarda sık sorulan Python kavram sorularını, klasik algoritma görevlerini ve canlı kodlama tekniklerini çalışırsın.

Uygulamada aç, 37 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Mülakat neyi ölçer?

Anadolu Market'in veri ekibine Python geliştirici alınıyor. İlk tur kavram soruları: "GIL nedir, pandas'ı neden etkilemez?" İkinci tur canlı kodlama: "Şu sipariş listesinde toplamı X eden iki ürünü bul." Üçüncü tur sistem tasarımı: "Günde milyonlarca siparişi işleyen bir boru hattını (pipeline) nasıl kurarsın?" Üç tur üç farklı şeyi ölçer: dili gerçekten anlıyor musun, problemi yapılandırılmış biçimde çözebiliyor musun, büyük resmi görüyor musun. Bu ders üçünü de çalıştırır; ağırlık ikinci turda, çünkü en çok orada elenilir.

Sık sorulan Python kavram soruları

Aşağıdaki tablo, mülakatlarda en sık çıkan kavram sorularını ve bir cümlelik çekirdek cevaplarını listeler. Cevabı ezberleme; her birini küçük bir örnekle gösterebilecek kadar anla.

SoruÇekirdek cevapTakip sorusu
GIL nedir?CPython'da aynı anda yalnızca bir iş parçacığının Python bytecode çalıştırmasına izin veren kilitNeden threading I/O için işe yarar ama CPU için yaramaz? (I/O beklerken kilit bırakılır; numpy/pandas C kodu da bırakır)
Mutable default argümanVarsayılan değer tanım anında bir kez oluşur; liste/sözlük çağrılar arasında paylaşılırÇözüm? (None + içeride oluştur)
is ile == farkıis kimlik (aynı nesne mi), == eşitlik (__eq__)Neden x is None doğru, x == None yanlış stil? (None tekildir; __eq__ ezilebilir)
Shallow / deep copyShallow dış kabı kopyalar, iç nesneler paylaşılır; deep özyinelemeli kopyalarlist(x), x[:], x.copy() hangisi? (hepsi shallow)
Generator vs listGenerator tembel, tek geçişlik, O(1) bellek; liste tüm veriyi tutar, tekrar gezilirsum(x*x for x in r) neden sum([x*x for x in r])'den iyi?
DecoratorFonksiyon alıp fonksiyon döndüren fonksiyon; @ sözdizimi şekerdirfunctools.wraps neden? (ad ve docstring korunur)
__slots__Örnek başına __dict__ yerine sabit alanlar; bellek ve erişim hızı kazancıDezavantaj? (dinamik nitelik eklenemez, çoklu kalıtımda (inheritance) dikkat)

Üçünü kodla doğrula; mülakatta "göstereyim" diyebilmek güven verir:

import copy

# is vs ==
a = [1, 2]
b = [1, 2]
print(a == b, a is b)          # True False

# shallow vs deep
siparis = {"id": 1, "urunler": ["kalem"]}
s1 = siparis.copy()
s2 = copy.deepcopy(siparis)
siparis["urunler"].append("defter")
print(s1["urunler"], s2["urunler"])   # paylaşılan liste / bağımsız liste

# mutable default
def ekle(x, kutu=[]):
    kutu.append(x)
    return kutu
print(ekle(1), ekle(2))        # aynı liste iki kez

# __slots__
class Nokta:
    __slots__ = ("x", "y")
    def __init__(self, x, y):
        self.x, self.y = x, y
n = Nokta(1, 2)
print(hasattr(n, "__dict__"))  # False

Algoritma soruları: kalıpları tanı

Mülakat sorularının büyük kısmı beş altı kalıba iner. Soruyu duyunca kalıbı tanırsan çözümün yarısı bitmiştir.

1. Sözlükle sayım ve arama: iki toplam

"Listede toplamı hedef eden iki elemanın indekslerini bul." Kaba yol çift döngü, O(n²). Akıllı yol: gördüğün her sayıyı sözlüğe koy, sıradaki sayının tamamlayıcısı (hedef - sayı) sözlükte mi diye bak. Tek geçiş, O(n).

def iki_toplam(sayilar, hedef):
    gorulen = {}                       # değer -> indeks
    for i, s in enumerate(sayilar):
        kalan = hedef - s
        if kalan in gorulen:
            return [gorulen[kalan], i]
        gorulen[s] = i
    return []

fiyatlar = [250, 90, 410, 160, 300]
print(iki_toplam(fiyatlar, 500))   # 250 + 250 yok; 90 + 410 -> [1, 2]
print(iki_toplam(fiyatlar, 1000))  # []

Aynı kalıp "anagram grupları"nda anahtarı sıralanmış harfler yaparak, "en çok tekrar eden ürün"de Counter ile görünür. Soru "bul, say, grupla" diyorsa sözlük düşün.

2. Küme ile O(n): en uzun ardışık dizi

"Sırasız sayılarda en uzun ardışık sayı dizisinin uzunluğu?" Sıralamak O(n log n). Küme ile O(n): her sayı için, bir eksiği kümede yoksa bu bir dizinin başıdır; ileri say.

def en_uzun_ardisik(sayilar):
    kume = set(sayilar)
    en_iyi = 0
    for s in kume:
        if s - 1 not in kume:          # yalnızca dizi başlarından say
            n = 1
            while s + n in kume:
                n += 1
            en_iyi = max(en_iyi, n)
    return en_iyi

print(en_uzun_ardisik([100, 4, 200, 1, 3, 2]))   # 1,2,3,4 -> 4

Neden O(n)? Her sayı yalnızca ait olduğu dizinin başından itibaren bir kez sayılır. Mülakatçı "neden while içinde while var ama O(n)?" diye sorar; cevap bu.

3. Kayan pencere (sliding window)

"Art arda k günün en yüksek toplam cirosu" ya da "tekrarsız en uzun alt dize." Sabit ya da esneyen bir pencereyi sağa kaydırırsın; giren elemanı ekler, çıkanı çıkarırsın. Her adımda yeniden toplamak O(n·k); pencereyle O(n).

def en_iyi_pencere(ciro, k):
    toplam = sum(ciro[:k])
    en_iyi, bas = toplam, 0
    for i in range(k, len(ciro)):
        toplam += ciro[i] - ciro[i - k]
        if toplam > en_iyi:
            en_iyi, bas = toplam, i - k + 1
    return bas, en_iyi

gunluk = [120, 300, 80, 450, 200, 90, 310]
print(en_iyi_pencere(gunluk, 3))   # (1, 830): 300+80+450

4. İki pointer ve ikili arama

Sıralı veride iki uçtan ortaya yürümek (iki pointer) ya da ortadan ikiye bölmek (ikili arama, O(log n)) klasik kalıplardır. bisect modülü ikili aramayı hazır verir ama mülakatta elle yazmanı isterler: lo, hi sınırları ve mid hesabı; döngü lo <= hi sürdükçe.

def ikili_ara(sirali, hedef):
    lo, hi = 0, len(sirali) - 1
    while lo <= hi:
        mid = (lo + hi) // 2
        if sirali[mid] == hedef:
            return mid
        if sirali[mid] < hedef:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1

print(ikili_ara([3, 8, 15, 21, 42, 57], 21))   # 3
print(ikili_ara([3, 8, 15, 21, 42, 57], 22))   # -1

5. BFS: en kısa yol

Grafta "A'dan B'ye en az kaç adım?" sorusunda genişlik öncelikli arama (BFS) kullanılır: kuyruk (collections.deque) ve ziyaret edilenler kümesi. Depo ağı, sosyal bağlantı, kelime merdiveni; hepsi aynı kalıp.

from collections import deque

depolar = {
    "İstanbul": ["Bursa", "Kocaeli"],
    "Bursa": ["İstanbul", "Eskişehir"],
    "Kocaeli": ["İstanbul", "Ankara"],
    "Eskişehir": ["Bursa", "Ankara"],
    "Ankara": ["Kocaeli", "Eskişehir"],
}

def en_kisa_adim(graf, bas, hedef):
    kuyruk = deque([(bas, 0)])
    ziyaret = {bas}
    while kuyruk:
        dugum, adim = kuyruk.popleft()
        if dugum == hedef:
            return adim
        for komsu in graf.get(dugum, []):
            if komsu not in ziyaret:
                ziyaret.add(komsu)
                kuyruk.append((komsu, adim + 1))
    return -1

print(en_kisa_adim(depolar, "İstanbul", "Ankara"))   # 2
Ziyareti kuyruğa eklerken işaretleKuyruktan çıkarırken işaretlersen aynı düğüm kuyruğa birden çok kez girer; büyük grafta süre patlar. Kümeye ekleme anı, kuyruğa ekleme anıyla aynı olmalı.

Karmaşıklık: Big-O konuşabilmek

Her çözümden sonra mülakatçı "karmaşıklığı ne?" diye sorar. Kısa sözlük: sözlük/küme erişimi O(1) ortalama; listede arama O(n); sıralama O(n log n); çift döngü O(n²); ikili arama O(log n); BFS O(V + E). Bellek için de aynı soru gelir: ek sözlük tutuyorsan O(n) bellek. "Daha iyisi var mı?" sorusuna, mümkünse "hayır, çünkü her elemana en az bir kez bakmak gerekir" gibi bir alt sınır argümanı ver.

Python'a özgü püf noktalarin listede O(n), kümede O(1). String birleştirmede döngüde += yerine liste toplayıp "".join. list.pop(0) O(n), deque.popleft() O(1). Bunları söylemek "dili biliyor" izlenimi verir.

Canlı kodlama ipuçları

  1. Soruyu tekrar et ve netleştir: Girdi boş olabilir mi? Negatif sayı var mı? Tekrar eden eleman? Çıktı indeks mi değer mi? Her soru bir puan.
  2. Küçük bir örnek yaz: 4-5 elemanlı girdi ve beklenen çıktı. Örnek olmadan kod yazma.
  3. Önce kaba çözümü söyle: "Çift döngüyle O(n²) olur; sözlükle O(n)'e indirebilirim." Mülakatçı düşünme sürecini görmek ister.
  4. Sesli düşün, sessiz yazma: Takıldığında "burada iki seçenek var" de. Sessizlik en kötü sinyaldir.
  5. Yazdıktan sonra örnekle izle: Kodu satır satır örnek üzerinde yürüt. Kenar durumları (boş, tek eleman, hepsi aynı) kontrol et.
  6. Karmaşıklığı kendin söyle: Sorulmadan "zaman O(n), bellek O(n)" de.
  7. Temiz ad ve küçük fonksiyon: a, b, tmp yerine gorulen, kalan. Test edilebilir fonksiyon yaz, print ile değil return ile sonuç ver.

Sistem tasarımı için Python

Üst düzey pozisyonlarda "Ilgaz Bank'ın işlem akışını işleyen bir servis tasarla" tarzı sorular gelir. Beklenen, kod değil, bileşenler ve seçimler: giriş (API, kuyruk), işleme (worker havuzu), depolama (ilişkisel/belge), gözlemleme (log, metrik). Python özelinde şunları söyleyebilmek fark yaratır: I/O yoğun servis için asyncio + FastAPI; CPU yoğun iş için multiprocessing ya da ayrı worker; büyük veri için pandas yerine parçalı işleme ya da polars/duckdb; durum paylaşımı için Redis; kuyruk için Celery/RQ ya da bulut kuyruğu. Her seçimi "neden" ile bağla: "GIL yüzünden CPU işini thread'e değil process'e veririm."

Derinleş

Derinleş: eksik kalan beş kalıp

Ders boyunca sözlük, küme, kayan pencere, iki pointer, ikili arama ve BFS kalıplarını gördün. Mülakat sorularının geri kalanının çoğu beş kalıba daha iner: yığın (stack), yığın-kuyruk (heap), önek toplamı (prefix sum), dinamik programlama (dynamic programming) ve geri izleme (backtracking). Bunlara aralık birleştirme ve LRU önbellek gibi "tasarım" sorularını eklersen klasik soru havuzunun büyük bölümünü kapsamış olursun. Özyinelemenin (recursion) temelini "Özyineleme" dersinde, sıralama algoritmalarının içini "Algoritmalar" dersinde gördün; burada mülakat açısından bakıyoruz.

Soruda duyduğunKalıpPython aracıTipik karmaşıklık
"eşleşen parantez", "bir sonraki büyük eleman", "geri al"Yığınlist.append / popO(n)
"en büyük k", "en sık k", "sıralı listeleri birleştir", "en kısa yol (ağırlıklı)"HeapheapqO(n log k)
"toplamı k olan alt dizi sayısı", "aralık toplamı"Önek toplamı + sözlükitertools.accumulate, dictO(n)
"en az kaç", "kaç farklı yol", "en uzun ortak"Dinamik programlamaliste tablosu, functools.cacheO(n·m)
"tüm kombinasyonlar", "tüm permütasyonlar", "geçerli tüm yerleşimler"Geri izlemeözyineleme + listeüstel
"çakışan aralıklar", "toplantı odası"Sırala + tarasorted(key=...)O(n log n)

1. Yığın: son giren ilk çıkar

Parantez doğrulama en klasik yığın sorusudur. Bir adım ötesi monoton yığındır: "her gün için fiyatın kaç gün sonra yükseleceğini bul" gibi sorularda, henüz cevabı bulunmamış günlerin indekslerini azalan sırada yığında tutarsın. Her indeks bir kez girip bir kez çıktığı için toplam O(n) olur.

def gecerli_mi(ifade):
    eslesme = {")": "(", "]": "[", "}": "{"}
    yigin = []
    for c in ifade:
        if c in "([{":
            yigin.append(c)
        elif c in eslesme:
            if not yigin or yigin.pop() != eslesme[c]:
                return False
    return not yigin

print(gecerli_mi("{[()()]}"), gecerli_mi("([)]"), gecerli_mi("(("))

def kac_gun_sonra(fiyat):
    sonuc = [0] * len(fiyat)
    yigin = []                          # cevabı bekleyen günlerin indeksleri
    for i, f in enumerate(fiyat):
        while yigin and fiyat[yigin[-1]] < f:
            j = yigin.pop()
            sonuc[j] = i - j
        yigin.append(i)
    return sonuc

print(kac_gun_sonra([73, 74, 75, 71, 69, 72, 76, 73]))

2. Heap: en büyük k ve ağırlıklı en kısa yol

heapq en küçük elemanı her zaman h[0]'da tutan bir min-heap'tir; ekleme ve çıkarma O(log n). "En büyük k" için boyutu k olan bir min-heap tut: yeni eleman tepedekinden büyükse değiştir. Böylece n elemanı O(n log k)'da tararsın; heapq.nlargest bunu hazır yapar. Max-heap gerekiyorsa değerleri eksiyle çarparak koy. Dijkstra algoritması da heap'e dayanır: her adımda en yakın düğümü çıkarırsın.

import heapq

siparisler = [("S1", 420), ("S2", 90), ("S3", 1250), ("S4", 610), ("S5", 300)]
print(heapq.nlargest(2, siparisler, key=lambda s: s[1]))

def dijkstra(graf, bas):
    mesafe = {bas: 0}
    h = [(0, bas)]
    while h:
        d, u = heapq.heappop(h)
        if d > mesafe.get(u, float("inf")):
            continue                     # eski, geçersiz kayıt
        for v, w in graf.get(u, []):
            yeni = d + w
            if yeni < mesafe.get(v, float("inf")):
                mesafe[v] = yeni
                heapq.heappush(h, (yeni, v))
    return mesafe

yollar = {"Depo": [("Kadıköy", 12), ("Beşiktaş", 7)],
          "Beşiktaş": [("Kadıköy", 3), ("Şişli", 4)],
          "Kadıköy": [("Ataşehir", 6)], "Şişli": [("Ataşehir", 15)]}
print(dijkstra(yollar, "Depo"))

3. Önek toplamı

onek[i] ilk i elemanın toplamıysa, i..j aralığının toplamı onek[j+1] - onek[i] olur. "Toplamı k olan kaç alt dizi var?" sorusunda her konumda "şimdiye kadarki toplam - k" değerinin daha önce kaç kez görüldüğünü sözlükte sayarsın. Negatif sayılar olduğunda kayan pencere çalışmaz, önek toplamı çalışır; bu ayrımı söylemek artı puandır.

4. Dinamik programlama

İki işaret ara: optimal alt yapı (büyük problemin cevabı küçüklerinkinden kurulur) ve örtüşen alt problemler (aynı küçük problem tekrar tekrar çözülür). İki yazım şekli vardır: yukarıdan aşağı (özyineleme + functools.cache) ve aşağıdan yukarı (tablo). Mülakatta önce özyinelemeli tanımı söyle, sonra tabloya çevir.

from functools import cache

def para_ustu(bozuklar, tutar):
    """En az kaç bozuk para? Mümkün değilse -1."""
    SONSUZ = float("inf")
    dp = [0] + [SONSUZ] * tutar          # dp[t]: t tutarı için en az para
    for t in range(1, tutar + 1):
        for b in bozuklar:
            if b <= t and dp[t - b] + 1 < dp[t]:
                dp[t] = dp[t - b] + 1
    return dp[tutar] if dp[tutar] != SONSUZ else -1

print(para_ustu([1, 5, 10, 25], 63), para_ustu([5, 10], 3))

@cache
def yol_sayisi(satir, sutun):
    """Izgarada sol üstten sağ alta yalnız sağ/aşağı giderek kaç yol?"""
    if satir == 1 or sutun == 1:
        return 1
    return yol_sayisi(satir - 1, sutun) + yol_sayisi(satir, sutun - 1)

print(yol_sayisi(3, 7), yol_sayisi.cache_info().hits)
Açgözlü yaklaşım tuzağıPara üstünde "her seferinde en büyük parayı al" (greedy) TL/kuruş gibi sistemlerde doğru çalışır ama [1, 3, 4] ile 6 için 4+1+1 (3 para) verir; doğrusu 3+3 (2 para). Mülakatçı tam bu karşı örneği sorar: greedy önerirsen neden doğru olduğunu kanıtlamaya hazır ol.

5. Geri izleme ve aralıklar

Geri izleme, seçim yap, özyinele, seçimi geri al döngüsüdür. "Toplamı hedef olan tüm kombinasyonlar" ya da "tüm alt kümeler" bu kalıptır; dalı erken kesmek (pruning, ör. sıralı adaylarda toplam aşınca break) süreyi ciddi biçimde düşürür. Aralık sorularında ise neredeyse her zaman ilk adım başlangıca göre sıralamaktır.

def birlestir(araliklar):
    sonuc = []
    for bas, bit in sorted(araliklar):
        if sonuc and bas <= sonuc[-1][1]:
            sonuc[-1][1] = max(sonuc[-1][1], bit)
        else:
            sonuc.append([bas, bit])
    return sonuc

print(birlestir([(9, 11), (1, 3), (2, 6), (8, 10), (15, 18)]))

def alt_kumeler(ogeler):
    sonuc, secim = [], []
    def gez(i):
        if i == len(ogeler):
            sonuc.append(secim.copy())   # kopyala: secim değişmeye devam edecek
            return
        secim.append(ogeler[i]); gez(i + 1)   # al
        secim.pop();             gez(i + 1)   # alma (geri al)
    gez(0)
    return sonuc

print(alt_kumeler(["çay", "simit", "peynir"]))
Python'a özgü kısa yollarMülakatçı izin veriyorsa collections.Counter.most_common, heapq.merge, bisect.bisect_left, itertools.combinations ve functools.cache kullanmak serbesttir; ama "bunu elle yazabilir misin?" sorusuna hazır ol. Önce hazır aracı söyle, sonra elle yazmayı teklif et.
Gerçek işteBu kalıplar yalnız mülakat için değil: monoton yığın borsa/fiyat verisinde "bir sonraki zirve" hesabında, heap öncelikli iş kuyruklarında ve "en çok satan 10 ürün" raporlarında, önek toplamı kümülatif ciro ve tarih aralığı sorgularında, aralık birleştirme vardiya ve toplantı odası planlamada, LRU önbellek ise API yanıtlarını önbelleğe alırken doğrudan karşına çıkar.
Derinleş

Bu ders her rol için ortak çekirdeği veriyor: Python kavramları, algoritma kalıpları, canlı kodlama ve davranışsal sorular. Ama bir veri analisti ile bir backend geliştiricinin mülakatı aynı değildir. Bu bölüm iki şey ekliyor: öğrenme yoluna göre "hangi bölüm sana ne kadar lazım" haritası ve kendi kendine uygulayabileceğin 45 dakikalık bir deneme mülakatı senaryosu.

Öğrenme yollarına göre harita

YolBu dersten öncelikArdından çalışMülakatta ağırlık
Veri analistiKavram soruları, sözlükle sayım, davranışsal sorularVeri mülakatı (SQL, pandas, metrik, vaka), İş metrikleriSQL canlı yazım, pandas ile analiz, iş sorusunu metriğe çevirme
Veri bilimci / MLKavramlar, Big-O, kayan pencere, heapVeri mülakatı, ML derslerindeki SSS'lerİstatistik, model değerlendirme, sızıntı, A/B testi, ev ödevi
Veri mühendisiKalıpların tamamı, Big-O, ev ödeviVeri mülakatı, Mülakat kalıpları 2, Sistem tasarımıSQL, ETL tasarımı, idempotentlik, bölümleme, orkestrasyon
Backend / webKalıpların tamamı, canlı kodlama ipuçlarıMülakat kalıpları 2, Sistem tasarımıAlgoritma (orta), API ve veritabanı tasarımı, önbellek, güvenlik
AI mühendisiKavramlar, sözlük/küme kalıpları, ev ödeviSistem tasarımı (LLM servisleri), LLM dersleriRAG tasarımı, değerlendirme, maliyet ve gecikme
OtomasyonKavramlar, sayım ve metin kalıplarıPython Arena (Kolay/Orta)Dosya, Excel, hata yönetimi; çoğunlukla pratik görev
Sertifika (PCEP/PCAP)Kavram soruları ve "yanlış ama sık verilen cevaplar"Mülakat kalıpları 2, sınav bölümüDil ayrıntısı: kapsam, değişebilirlik, istisnalar, OOP

Haritayı şöyle kullan: kendi satırındaki ilk sütunu bu derste pekiştir, ikinci sütundaki dersleri sırayla bitir, üçüncü sütunu deneme mülakatlarında ağırlık olarak kullan. Python Arena'da rolüne uygun alan süzgeciyle günde 1-2 soru çözmek, kalıpları otomatikleştirmenin en verimli yoludur.

45 dakikalık deneme mülakatı

Gerçek teknik mülakatların çoğu 45-60 dakikadır ve benzer bir akışı izler. Bir arkadaşınla rol değiştirerek ya da kendi kendine süre tutarak uygula; ekranını kaydet ve sonra izle. Senaryo Anadolu Market'in backend/veri pozisyonuna göre yazıldı.

DakikaBölümGörüşmeci ne yapar?Sen ne yapmalısın?
0-5Tanışma"Kendinden ve son projenden bahset."90 saniyelik hazır özet: kim, ne yaptın, hangi sonuç
5-10Kavram ısınması2-3 kısa soru: değişebilirlik, üreteç, GILKısa tanım + örnek; bilmediğini kabul et ama akıl yürüt
10-35Canlı kodlamaBir problem, sonra bir takip sorusuNetleştir → örnek → kaba çözüm → iyileştir → test et
35-40Tasarım/vaka"Bunu günde 10 milyon siparişe nasıl ölçeklersin?"Darboğazı adlandır, iki seçenek ve ödünleşimini söyle
40-45Senin soruların"Sormak istediğin bir şey var mı?"Ekip, kod inceleme (code review), yayın süreci üzerine 2 hazır soru

Canlı kodlama problemi (25 dakika)

Görev: "Sipariş akışında her sipariş (musteri_id, zaman_sn) olarak geliyor. Son 60 saniyede 3'ten fazla sipariş veren müşterileri, sınırı ilk aştıkları an itibarıyla raporla." Takip sorusu: "Akış sıralı gelmiyorsa ne değişir? Bellek sınırlıysa?"

from collections import defaultdict, deque

def supheliler(siparisler, pencere=60, sinir=3):
    son = defaultdict(deque)          # müşteri -> penceredeki zamanlar
    bulunan = {}
    for musteri, t in siparisler:     # zaman sırasıyla geldiğini varsayıyoruz (netleştir!)
        q = son[musteri]
        q.append(t)
        while q[0] <= t - pencere:    # pencereden çıkanları at
            q.popleft()
        if len(q) > sinir and musteri not in bulunan:
            bulunan[musteri] = t
    return bulunan

akis = [(7, 0), (7, 10), (9, 12), (7, 30), (7, 55), (9, 70), (7, 61), (7, 62)]
print(supheliler(akis))

Değerlendirme ölçütleri: Soruyu netleştirdin mi (pencere dahil mi, sıralı mı)? Kaba çözümü söyleyip (her siparişte tüm geçmişi taramak, O(n²)) iyileştirdin mi? Karmaşıklığı söyledin mi (her zaman en fazla bir kez eklenip çıkarılır: O(n) zaman, O(müşteri × pencere) bellek)? Kenar durumları denedin mi (aynı saniyede sipariş, tam 60 saniye sınırı)?

Kendini puanla

Ölçüt1 (zayıf)3 (iyi)
Problem çözmeDoğrudan koda atladı, varsayım sormadıNetleştirdi, örnek üzerinde düşündü, alternatifleri tarttı
KodÇalışmadı ya da okunmuyorÇalışıyor, adlar anlamlı, fonksiyonlara bölünmüş
İletişimSessiz yazdıDüşündüğünü sesli anlattı, ipucunu kullandı
TestHiç denemediKendi örnekleriyle ve kenar durumlarla denedi
KarmaşıklıkBilmiyorZaman ve bellek için doğru O(...) ve gerekçe
Haftalık planMülakat sürecindeysen haftada iki deneme yap: biri bu senaryoyla, biri Python Arena'dan rastgele bir Orta soruyla. Her denemeden sonra en düşük puanlı ölçüt için bir sonraki haftaya tek bir hedef yaz ("kodlamadan önce iki örnek yazacağım").
Gerçek işteİşe alım ekipleri adayı tek bir doğru cevaptan çok sürece göre değerlendirir: belirsizlik karşısında soru sorması, takıldığında ilerleyebilmesi ve kendi kodunu test etmesi. Bu yüzden deneme mülakatı, soru ezberlemekten çok daha verimli bir hazırlıktır.
Uzmanlaş

Soruyu kalıba indirgeme pratiği

Her gün bir soru çöz ve çözümden sonra şu üç satırı yaz: kalıp (sözlük / küme / pencere / iki pointer / ikili arama / BFS-DFS / dinamik programlama), karmaşıklık, kenar durumları. Bir ay sonra soruları duyar duymaz kalıbı göreceksin. Dinamik programlama (en uzun ortak alt dizi, para üstü) ve heap (en büyük k eleman, heapq.nlargest) bu dersin kapsamı dışında kalan ama sık sorulan iki kalıptır; sırada onlar olsun.

Yanlış ama sık verilen cevaplar

"GIL Python'ı tek çekirdekli yapar" (yanlış: multiprocessing ve C uzantıları çekirdekleri kullanır). "Tuple değişmezdir, içi de değişmez" (yanlış: tuple içindeki liste değişir). "Decorator yalnızca loglama içindir" (eksik: önbellek, yetki, yeniden deneme, kayıt). "is daha hızlıdır, hep onu kullan" (yanlış: kimlik ile eşitlik farklı sorulardır; küçük tamsayı önbelleği yanıltır).

Ev ödevi projesi (take-home)

Bazı şirketler canlı kodlama yerine ev ödevi verir. Değerlendirme ölçütleri: README (nasıl çalışır, nasıl test edilir), testler, tip ipuçları (type hint), lint temizliği, küçük ve odaklı commit'ler, hata yönetimi. Bir önceki dersin kalite zincirini uygula; "çalışıyor" yetmez, "üretime konabilir" izlenimi ver.

Davranışsal sorular

"Zor bir hatayı nasıl buldun?" sorusuna STAR biçiminde cevap ver: Durum, Görev, Eylem, Sonuç. Teknik ayrıntı ver (profil aldım, darboğaz sorgu birleştirmedeydi, indeks ekledim) ama bir dakikayı geçme.

Alıştırmalara geç (37)