0Pricing
SQL Interview Prep · Ders

Boşluklar ve Adalar Problemini Tanıma

Bir sözel problemdeki örüntüyü ve temel gruplama fikrini belirleyin.

Boşluklar ve Adalar Problemini Tanıma, CoddyKit'te ücretsiz bir SQL Interview Prep dersidir. Bu, 4 dersinin 1. 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, SQL Interview Prep öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Interview Prep kursu toplamda 4 dersten oluşur.

Mülakatçıların Sınadığı Örüntü

Bir kıdemli mülakatçı sizden bir şeyin ardışık dizilerini bulmanızı istediğinde, bir boşluklar ve adalar problemiyle karşı karşıyasınızdır. Ad, zihinsel bir görüntüden gelir: birlikte olan satırlar bir ada oluşturur, aralarındaki kesintiler ise boşlukları oluşturur.

  • Bir ada, belirli bir kurala göre bitişik olan satırların daha fazla genişletilemeyen dizisidir (ardışık tamsayılar, ardışık tarihler veya tekrarlanan aynı durum).
  • Bir boşluk, iki ada arasındaki eksik bölümdür.

Bu problem sınıfını anında tanımak başlı başına kıdemli düzey göstergesidir. Birçok aday kendi kendine birleştirmelerden oluşan karmaşık bir yapıya yönelir; zarif çözüm ise neredeyse her zaman pencere işlevleridir.

Bir Ada Saklayan Sözel Problemler

Zorluk, mülakatçıların nadiren "boşluklar ve adalar" demesidir. Bunun yerine problemi gizlerler. Şu tür ifadeleri duymaya alışın:

  • "Bir kullanıcının kesintisiz abone olduğu her dönemi bulun."
  • "Sunucu kaç ardışık gün boyunca çalışır durumda kaldı?"
  • "Bu tablodaki eksik kimlik aralıkları hangileri?"
  • "Aynı duruma sahip bitişik satırları tek satırda birleştirin."

Bunların her biri aynı yapıya sahiptir: yan yana olan satırları gruplayın, ardından bu grupların başlangıcını, bitişini veya yokluğunu raporlayın. Sözcükleri adalara eşlediğinizde SQL kendiliğinden yazılır.

Temel İçgörü: Grup Anahtarı Üretme

İşte tüm teknik tek cümlede: aynı adadaki her satıra aynı grup anahtarını atayabilirseniz, basit bir GROUP BY her adayı tek bir özet satırında toplar.

Dolayısıyla herhangi bir boşluklar ve adalar problemindeki asıl iş, bu grup anahtarını hesaplamaktır. Farklı çeşitler bunu farklı biçimlerde hesaplar, ancak hepsi aynı amacı paylaşır. Anahtara sahip olduktan sonra son adım basittir:

SELECT
  grp,
  MIN(value) AS island_start,
  MAX(value) AS island_end,
  COUNT(*)   AS island_length
FROM rows_with_group_key
GROUP BY grp
ORDER BY island_start;

Somut Bir Veri Kümesi

Verilerle başlayalım. Bir kullanıcının giriş yaptığı gün numaralarını izleyen bir logins tablosu düşünün:

  • Mevcut günler: 1, 2, 3, 7, 8, 10

Gözle bakıldığında adalar {1,2,3}, {7,8} ve {10} şeklindedir. Boşluklar 4-6. günler ile 9. gündür. Bir mülakatta göreviniz, bu üç adayı elle işaret etmeden veritabanına gördürmektir. Her tekniği incelerken bu küçük veri kümesini aklınızda tutun.

CREATE TABLE logins (day_no INT);
INSERT INTO logins VALUES (1),(2),(3),(7),(8),(10);

Saf Yaklaşımlar Neden Başarısız Olur

Yaygın ilk tepki, her satırı bir sonraki satırla kendi kendine birleştirme kullanarak karşılaştırmak ve kopmaları işaretlemektir. Bu, tek bir boşluğu bulmakta işe yarar ancak hızla kullanışsız hale gelir:

  • Her adanın hem başlangıcını hem de sonunu saptamanız gerekir; bu da iki geçiş veya iki birleştirme demektir.
  • Kenar satırları (tam ilk ve tam son satırlar) özel işlem gerektirir.
  • Daha fazla mekanizma olmadan "her dizinin uzunluğunu ver" talebine genellenemez.

Mülakatçılar, kendi kendine birleştirme savaşına girip girmediğinizi veya tek geçişte bir pencere işlevinin daha temiz olduğunu fark edip etmediğinizi gözlemler.

Boşluk Algılama Zihinsel Modeli

Sağlam bir çerçeve şudur: geçerli satır, önceki satıra bitişik olmadığında yeni bir ada başlar. Geriye bir satır bakmak ve karşılaştırma yapmak için LAG kullanın.

day_no - LAG(day_no) 1'den büyükse (veya ilk satır için NULL ise) bu satır yeni bir adanın başlangıcıdır. Bunu 1 bayrağıyla, aksi durumda 0 ile işaretleriz. Bu bayrakların verilerimiz için nasıl göründüğüne bakın.

SELECT
  day_no,
  CASE
    WHEN day_no - LAG(day_no) OVER (ORDER BY day_no) = 1 THEN 0
    ELSE 1
  END AS is_new_island
FROM logins
ORDER BY day_no;

Bayrakları Grup Anahtarına Dönüştürme

Önceki adımdaki bayraklar, 1,2,3,7,8,10 günleri için 1, 0, 0, 1, 0, 1 değerleridir. Çalışan toplamın bu bayraklardan, bir ada içinde sabit kalan ve her yeni adada artan bir sayı ürettiğine dikkat edin: 1,1,1,2,2,3.

Ürettiğimiz grup anahtarı bu çalışan toplamdır. Bayrak sorgusunu bir CTE içine alır ve başka bir pencere işleviyle toplarız:

WITH flagged AS (
  SELECT
    day_no,
    CASE WHEN day_no - LAG(day_no) OVER (ORDER BY day_no) = 1
         THEN 0 ELSE 1 END AS is_new_island
  FROM logins
)
SELECT
  day_no,
  SUM(is_new_island) OVER (ORDER BY day_no) AS grp
FROM flagged;

Uygulamalı Örneği Tamamlama

Şimdi grup anahtarının üzerine son GROUP BY işlemini ekleyin. Her farklı grp değeri bir adadır; sınırlarını ve boyutunu raporlarız:

Sonuç, gözle fark ettiğimiz üç adanın aynısıdır: 1-3 (uzunluk 3), 7-8 (uzunluk 2) ve 10-10 (uzunluk 1). Bu üç katmanlı tarif (bayrak, çalışan toplam, grup), yazacağınız neredeyse her boşluklar ve adalar çözümünün omurgasıdır.

WITH flagged AS (
  SELECT day_no,
    CASE WHEN day_no - LAG(day_no) OVER (ORDER BY day_no) = 1
         THEN 0 ELSE 1 END AS is_new
  FROM logins
),
keyed AS (
  SELECT day_no,
    SUM(is_new) OVER (ORDER BY day_no) AS grp
  FROM flagged
)
SELECT grp, MIN(day_no) AS start_day,
       MAX(day_no) AS end_day, COUNT(*) AS len
FROM keyed GROUP BY grp ORDER BY start_day;

Bitişiklik Alana Özgüdür

Problemler arasında değişen tek bölüm bitişiklik tanımıdır. Doğru bitişiklik kuralını tanımak, problemi tanımanın yarısıdır:

  • Tamsayılar: fark tam olarak 1 olduğunda bitişiktir.
  • Takvim günleri: bir tarih sonraki gün olduğunda bitişiktir (date = prev + INTERVAL '1 day').
  • Durum dönemleri: durum değeri önceki satırdan değişmediğinde bitişiktir.

Aynı iskelet, CASE içindeki karşılaştırma farklıdır. Hangi bitişiklik kuralının geçerli olduğunu fark etmek, mülakatta sesli olarak sormanız gereken netleştirici sorudur.

Sorulacak Netleştirme Soruları

SQL'in tek bir satırını yazmadan önce kapsamı netleştirerek puan kazanın. Boşluklar ve adalar problemleri için iyi netleştirme soruları şunlardır:

  • "Verileri kullanıcı başına mı, yoksa genel olarak mı ele almalıyım?" (Bu, PARTITION BY user_id ekleyip eklemeyeceğinizi belirler.)
  • "Aynı gün için yinelenen değerler olabilir mi ve bunlar diziyi bozar mı yoksa uzatır mı?"
  • "Adaları, boşlukları veya her ikisini mi istiyorsunuz?"
  • "Dizinin sıralı olacağı garanti mi, yoksa kendim mi sıralamalıyım?"

Bu soruları sesli sormanız, bu problem sınıfını daha önce çözdüğünüzü ve uç durumlarını anladığınızı gösterir.

PARTITION BY ile Grup Bazında Adalar

Gerçek mülakat verileri neredeyse her zaman grupludur; örneğin kullanıcı başına girişler. Çözüm mekaniktir: her pencere işlevine PARTITION BY user_id ekleyin; böylece adalar kullanıcılar arasında asla uzanmaz.

İskelet aynıdır; yalnızca bölümlere ayırırsınız. Tek akışlı durumu önce öğrenmenin işe yarama nedeni budur; grup başına ölçekleme tek bir yan tümce değişikliğidir.

SELECT
  user_id, day_no,
  CASE WHEN day_no - LAG(day_no)
         OVER (PARTITION BY user_id ORDER BY day_no) = 1
       THEN 0 ELSE 1 END AS is_new
FROM logins;

Hızlı Kontrol

Örüntü tanıma içgüdünüzü sınayın.

Özet: Yapıyı Fark Etme

Artık bir boşluklar ve adalar problemini kılığından tanıyabilir ve stratejiyi adlandırabilirsiniz:

  • Tetikleyici sözcükler: ardışık, kesintisiz, bölünmemiş, seri, eksik aralıklar, bitişikleri tek satırda toplama.
  • Temel fikir: aynı dizideki her satıra aynı grup anahtarını atayın, ardından GROUP BY uygulayın.
  • Tarif: yeni adaları LAG ile bayraklayın, bayrakların çalışan toplamını bir anahtara dönüştürün, ardından toplulaştırın.
  • Bitişiklik alana özgüdür (tamsayılar, tarihler veya değişmeyen durum).
  • Grup başına analiz için PARTITION BY ekleyin; kodlamadan önce kapsamı netleştirin.

Sırada, anahtar oluşturmanın en zarif yöntemini, satır numarası farkı tekniğini daha ayrıntılı inceleyeceğiz.

Sıkça Sorulan Sorular

“Boşluklar ve Adalar Problemini Tanıma” dersi ücretsiz mi?

Evet — “Boşluklar ve Adalar Problemini Tanıma” 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 SQL Interview Prep kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Interview Prep kursu toplamda 4 dersten oluşur.

“Boşluklar ve Adalar Problemini Tanıma” dersinde ne öğreneceğim?

Bir sözel problemdeki örüntüyü ve temel gruplama fikrini belirleyin. SQL 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.

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

Önceden deneyim gerekmez. CoddyKit'te SQL 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 1. dersidir.

“Boşluklar ve Adalar Problemini Tanıma” 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 SQL Interview Prep dersinde kod yazıp çalıştırabilir miyim?

Evet. Her SQL 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. Boşluklar ve Adalar Problemini Tanıma
  2. Satır Numarası Farkı Hilesi
  3. Bir Dizideki Boşlukları Bulma
  4. Tarih ve Durum Değişiklikleriyle Adalar
← SQL Interview Prep Sayfasına Dön