Voorbereiding op programmeerinterviews · Les

Een probleem met hiaten en eilanden herkennen

Het patroon in een vraagstelling herkennen en het belangrijkste inzicht voor het groeperen begrijpen

Les 1 van 413 stappen

Een probleem met hiaten en eilanden herkennen is een gratis Voorbereiding op programmeerinterviews-les op CoddyKit. Dit is les 1 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.

Het patroon waarop interviewers testen

Wanneer een senior-interviewer je vraagt om opeenvolgende reeksen van iets te vinden, gaat het om een probleem met gaten en eilanden. De naam komt van een beeldspraak: rijen die bij elkaar horen vormen een eiland, en de onderbrekingen ertussen zijn gaten.

  • Een eiland is een maximale reeks rijen die volgens een bepaalde regel aangrenzend zijn (opeenvolgende gehele getallen, opeenvolgende datums of herhaaldelijk dezelfde status).
  • Een gat is de ontbrekende ruimte tussen twee eilanden.

Dat je dit soort probleem meteen herkent, is op zichzelf al een signaal van senioriteit. Veel kandidaten grijpen naar een wirwar van self-joins; het elegante antwoord bestaat vrijwel altijd uit windowfuncties.

Probleemstellingen die een eiland verbergen

De uitdaging is dat interviewers zelden letterlijk zeggen: "gaten en eilanden". Ze verhullen het probleem. Let op formuleringen zoals:

  • "Zoek elke periode waarin een gebruiker ononderbroken geabonneerd was."
  • "Hoeveel opeenvolgende dagen bleef de server actief?"
  • "Welke ID-bereiken ontbreken in deze tabel?"
  • "Voeg aangrenzende rijen met dezelfde status samen tot één rij."

Elk van deze vragen heeft dezelfde vorm: groepeer rijen die naast elkaar staan en rapporteer vervolgens het begin, het einde of het ontbreken van die groepen. Zodra je de woorden aan eilanden koppelt, schrijft de SQL zichzelf.

De kern: een groepssleutel maken

Hier is de hele truc in één zin: als je elke rij in hetzelfde eiland dezelfde groepssleutel kunt geven, laat een eenvoudige GROUP BY elk eiland samenvallen tot één samenvattingsrij.

Het echte werk in elk probleem met gaten en eilanden is dus het berekenen van die groepssleutel. Verschillende varianten berekenen die sleutel op verschillende manieren, maar ze streven allemaal hetzelfde doel na. Zodra je de sleutel hebt, is de laatste stap eenvoudig:

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;

Een concrete gegevensset

Laten we dit aan gegevens vastmaken. Stel je een tabel logins voor die bijhoudt op welke dagnummers een gebruiker heeft ingelogd:

  • Dagen die voorkomen: 1, 2, 3, 7, 8, 10

Op het eerste gezicht zijn de eilanden {1,2,3}, {7,8} en {10}. De gaten zijn dagen 4-6 en dag 9. Jouw taak in een sollicitatiegesprek is om de database deze drie eilanden te laten herkennen zonder ze handmatig aan te wijzen. Houd deze kleine gegevensset in gedachten terwijl we elke techniek bekijken.

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

Waarom naïeve aanpakken mislukken

Een veelvoorkomende eerste ingeving is om elke rij met de volgende te vergelijken via een self-join en onderbrekingen te markeren. Dat werkt om één gat te vinden, maar wordt al snel onhandelbaar:

  • Je moet zowel het begin als het einde van elk eiland detecteren, wat twee doorgangen of twee joins betekent.
  • Rijen aan de randen, dus de allereerste en allerlaatste rij, vereisen speciale behandeling.
  • Deze aanpak kan niet zonder extra hulpmiddelen worden uitgebreid naar "geef me de lengte van elke reeks".

Interviewers letten erop of je belandt in een oorlog met self-joins, of inziet dat één doorgang met een windowfunctie overzichtelijker is.

Het mentale model voor gatdetectie

Een robuuste manier om ernaar te kijken is: een nieuw eiland begint zodra de huidige rij niet aan de vorige grenst. Gebruik LAG om één rij terug te kijken en de rijen te vergelijken.

Als day_no - LAG(day_no) groter is dan 1 (of NULL is voor de eerste rij), begint deze rij een nieuw eiland. We markeren dat met een vlag 1 en anders met 0. Bekijk hoe die vlaggen eruitzien voor onze gegevens.

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;

Vlaggen omzetten in een groepssleutel

De vlaggen uit de vorige stap zijn 1, 0, 0, 1, 0, 1 voor de dagen 1,2,3,7,8,10. Let op: een cumulatieve som van die vlaggen levert een getal op dat binnen een eiland constant blijft en bij elk nieuw eiland met één toeneemt: 1,1,1,2,2,3.

Die cumulatieve som is onze geconstrueerde groepssleutel. We stoppen de query met de vlaggen in een CTE en tellen die op met een andere windowfunctie:

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;

Het uitgewerkte voorbeeld afronden

Voeg nu de laatste GROUP BY boven op de groepssleutel toe. Elke unieke waarde van grp is één eiland; we rapporteren de grenzen en de grootte ervan:

Het resultaat bestaat precies uit de drie eilanden die we op het eerste gezicht zagen: 1-3 (lengte 3), 7-8 (lengte 2) en 10-10 (lengte 1). Dit recept in drie lagen (vlag, cumulatieve som, groepering) vormt de basis van vrijwel elk antwoord over gaten en eilanden dat je zult schrijven.

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;

Aangrenzendheid is domeinspecifiek

Het enige dat tussen problemen verandert, is de definitie van aangrenzend. De juiste regel voor aangrenzendheid herkennen is de helft van het herkennen van het probleem:

  • Gehele getallen: aangrenzend als het verschil precies 1 is.
  • Kalenderdagen: aangrenzend als de ene datum de volgende dag is (date = prev + INTERVAL '1 day').
  • Statusperioden: aangrenzend als de statuswaarde ongewijzigd is ten opzichte van de vorige rij.

De basisstructuur blijft hetzelfde; alleen de vergelijking binnen CASE verandert. Bepalen welke regel voor aangrenzendheid van toepassing is, is de verduidelijkende vraag die je tijdens het sollicitatiegesprek hardop moet stellen.

Verduidelijkende vragen om te stellen

Voordat je een regel SQL schrijft, scoor je punten door eerst de reikwijdte te verduidelijken. Goede verduidelijkingen bij problemen met gaten en eilanden zijn:

  • "Moet ik de gegevens per gebruiker behandelen, of globaal?" (Dat bepaalt of je PARTITION BY user_id toevoegt.)
  • "Kunnen er op dezelfde dag dubbele waarden voorkomen, en verbreken of verlengen die een reeks?"
  • "Wil je de eilanden, de gaten of beide?"
  • "Is de reeks gegarandeerd gesorteerd, of moet ik die zelf ordenen?"

Door deze vragen hardop te stellen laat je zien dat je dit soort probleem al eerder hebt opgelost en de randgevallen begrijpt.

Eilanden per groep met PARTITION BY

Echte gegevens uit sollicitatiegesprekken zijn bijna altijd gegroepeerd, bijvoorbeeld logins per gebruiker. De oplossing is mechanisch: voeg aan elke windowfunctie PARTITION BY user_id toe, zodat eilanden nooit over gebruikers heen lopen.

De basisstructuur is identiek; je deelt de gegevens alleen op in partities. Daarom loont het om eerst de situatie met één gegevensstroom goed te beheersen: uitbreiden naar groepen per gebruiker is slechts een wijziging van één clausule.

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;

Korte controle

Toets je patroonherkenning.

Samenvatting: de vorm herkennen

Je kunt nu een probleem met gaten en eilanden herkennen aan de verhulling ervan en de strategie benoemen:

  • Signaalwoorden: opeenvolgend, doorlopend, ononderbroken, reeks, ontbrekende bereiken, aangrenzende rijen samenvoegen.
  • Kernidee: geef elke rij in dezelfde reeks één identieke groepssleutel en gebruik daar vervolgens GROUP BY op.
  • Recept: markeer nieuwe eilanden met LAG, maak met een cumulatieve som van de vlaggen een sleutel en aggregeer daarna.
  • Aangrenzendheid is domeinspecifiek (gehele getallen, datums of een ongewijzigde status).
  • Voeg PARTITION BY toe voor analyse per groep en verduidelijk de reikwijdte voordat je code schrijft.

Vervolgens scherpen we de elegantste methode om een sleutel te maken aan: de truc met het verschil tussen rijnummers.

Gratis beginnen

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 “Een probleem met hiaten en eilanden herkennen” gratis?

Ja — de volledige tekst van “Een probleem met hiaten en eilanden herkennen” 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 “Een probleem met hiaten en eilanden herkennen”?

Het patroon in een vraagstelling herkennen en het belangrijkste inzicht voor het groeperen begrijpen 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 1 van 4.

Hoe lang duurt de les “Een probleem met hiaten en eilanden herkennen”?

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

  1. Een probleem met hiaten en eilanden herkennen
  2. De truc met het verschil van rijnummers
  3. Hiaten in een reeks vinden
  4. Eilanden met datum- en statuswijzigingen
← Terug naar Voorbereiding op programmeerinterviews