Persediaan Temu Duga Pengaturcaraan · Pelajaran

N Baris Berturutan yang Memenuhi Syarat

Corak tetingkap klasik “tiga hari berturut-turut dengan jualan melebihi X”.

Pelajaran 3 daripada 413 langkah

N Baris Berturutan yang Memenuhi Syarat ialah pelajaran Persediaan Temu Duga Pengaturcaraan percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga Pengaturcaraan, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Klasik LeetCode

Ini ialah salah satu masalah temu duga SQL yang paling kerap ditanya: "Cari semua tarikh yang mempunyai sekurang-kurangnya tiga hari berturutan dengan jualan melebihi suatu ambang," atau soalan kegemaran LeetCode, "laporkan stadium yang mempunyai 3+ baris berturutan dengan kehadiran melebihi 100."

Bentuknya sentiasa sama: sesuatu baris hanya layak jika baris itu berada dalam rentetan sebanyak N baris berturutan yang layak. Pelajaran ini menunjukkan dua penyelesaian yang kemas serta perangkap yang menjerat kebanyakan calon.

Data Contoh

Kita menggunakan jadual sales harian. Syaratnya ialah amount > 100. Kita mesti mengembalikan setiap hari yang termasuk dalam rentetan 3 hari kalendar berturutan atau lebih, yang semuanya memenuhi syarat.

  • sale_date — satu baris bagi setiap hari
  • amount — jumlah jualan pada hari tersebut

Kehalusan penting: baris mestilah berturutan dari segi urutan, dan bagi versi berasaskan tarikh, mestilah berturutan dalam kalendar juga.

SELECT * FROM sales ORDER BY sale_date;
-- sale_date  | amount
-- 2024-03-01 |  120
-- 2024-03-02 |  150
-- 2024-03-03 |  130
-- 2024-03-04 |   90
-- 2024-03-05 |  200

Pendekatan 1: Tapis Kemudian Kelompok

Pendekatan yang teguh: mula-mula kekalkan hanya baris yang memenuhi syarat, kemudian kelompokkan baris yang tinggal kepada kelompok berturutan, dan akhirnya kekalkan kelompok yang panjangnya sekurang-kurangnya N.

Langkah pertama ialah penapisan WHERE. Langkah kedua menggunakan semula penambat jurang-dan-kelompok. Oleh sebab kita menapis terlebih dahulu, kelompok di sini bermaksud "rentetan hari berturutan yang memenuhi syarat."

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
)
SELECT * FROM qualifying ORDER BY sale_date;

Menambat Rentetan yang Memenuhi Syarat

Nomborkan baris yang memenuhi syarat mengikut tarikh dan lakukan penolakan untuk mendapatkan penambat kelompok. Baris yang berturutan pada kalendar AND semuanya memenuhi syarat akan berkongsi penambat; sebarang hari yang tidak memenuhi syarat telah dibuang, lalu memutuskan rentetan tepat pada tempat yang sepatutnya.

WITH qualifying AS (
  SELECT sale_date
  FROM sales
  WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
)
SELECT sale_date, sale_date - rn AS grp
FROM numbered;

Mengekalkan Kelompok yang Cukup Panjang

Kumpulkan mengikut penambat, kira baris, dan kekalkan hanya kumpulan dengan COUNT(*) >= 3. Jika penemuduga mahu tarikh individu yang memenuhi syarat dikembalikan, cantumkan penambat yang dikekalkan dengan baris bernombor.

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Pendekatan 2: Tetingkap COUNT Gelongsor

Pendekatan yang lebih menarik apabila N kecil dan tetap: gunakan bingkai tetingkap untuk mengira jumlah baris di sekeliling yang turut memenuhi syarat. Jika mana-mana tetingkap yang mengandungi N baris berturutan termasuk baris ini dan semuanya memenuhi syarat, baris tersebut termasuk dalam jawapan.

Mula-mula tambahkan penanda benar-palsu, kemudian jumlahkan penanda itu merentasi bingkai gelongsor.

SELECT sale_date, amount,
  CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
FROM sales;

Menjumlahkan Merentasi Tiga Bingkai

Untuk rentetan tepat 3 baris, baris yang memenuhi syarat termasuk dalam jawapan jika tetingkap 3 baris yang berakhir di sini, berpusat di sini, atau bermula di sini mempunyai jumlah 3. Kira ketiga-tiga jumlah bergerak tersebut dan uji sama ada mana-mana satunya bersamaan dengan 3.

Inilah teknik di sebalik penyelesaian LeetCode 601 (Trafik Manusia di Stadium).

WITH flagged AS (
  SELECT sale_date, amount,
    CASE WHEN amount > 100 THEN 1 ELSE 0 END AS ok
  FROM sales
),
w AS (
  SELECT *,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS s_end,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS s_mid,
    SUM(ok) OVER (ORDER BY sale_date
      ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING) AS s_start
  FROM flagged
)
SELECT sale_date, amount
FROM w
WHERE ok = 1 AND (s_end = 3 OR s_mid = 3 OR s_start = 3);

Perangkap Jurang Kalendar

Pendekatan jumlah tetingkap menggunakan ROWS, yang mengira baris hasil bersebelahan, bukannya hari kalendar yang bersebelahan. Jika hari yang tidak memenuhi syarat telah ditapis keluar, dua baris boleh bersebelahan dalam hasil tetapi tidak berturutan dalam kalendar.

Pengajaran: gunakan tetingkap gelongsor pada siri harian penuh (jangan tapis terlebih dahulu), atau gunakan kaedah penambat tarikh yang sememangnya menghormati jurang kalendar. Nyatakan pertukaran ini dalam temu duga.

Menggeneralisasikan kepada Sebarang N

Pendekatan 1 (tapis-kemudian-kelompok) mudah digeneralisasikan: cuma ubah HAVING COUNT(*) >= N. Itulah kelebihan besarnya berbanding jumlah berbilang tetingkap, yang memerlukan lebih banyak bingkai apabila N bertambah.

Untuk N yang diparameterkan atau besar, utamakan kaedah kelompok — ia hanya memerlukan satu perubahan ambang berbanding N−1 tetingkap yang perlu ditulis secara manual.

-- only the threshold changes for N = 5
HAVING COUNT(*) >= 5

Memilih Pendekatan

Panduan keputusan ringkas untuk disebut dengan jelas:

  • Tapis-kemudian-kelompok: menghormati jurang kalendar, boleh digeneralisasikan kepada sebarang N, dan mengembalikan rentetan penuh — pilihan lalai yang selamat.
  • Jumlah tetingkap gelongsor: kemas untuk N kecil yang tetap pada siri harian yang padat, tetapi berhati-hati dengan perangkap ROWS berbanding kalendar.

Menyebut kedua-duanya, kemudian memberikan alasan bagi pilihan anda, ialah perkara yang sememangnya dihargai oleh penemuduga peringkat pertengahan hingga kanan.

Penyelesaian Lengkap

Jawapan mudah alih untuk sebarang N yang menghormati keberterusan kalendar dan mengembalikan tarikh yang memenuhi syarat:

WITH qualifying AS (
  SELECT sale_date FROM sales WHERE amount > 100
),
numbered AS (
  SELECT sale_date,
    ROW_NUMBER() OVER (ORDER BY sale_date) AS rn
  FROM qualifying
),
islands AS (
  SELECT sale_date - rn AS grp, COUNT(*) AS len
  FROM numbered
  GROUP BY sale_date - rn
  HAVING COUNT(*) >= 3
)
SELECT n.sale_date
FROM numbered n
JOIN islands i ON n.sale_date - n.rn = i.grp
ORDER BY n.sale_date;

Semakan Pantas

Kenal pasti pepijat yang halus.

Ringkasan

Untuk N baris berturutan yang memenuhi suatu syarat:

  • Tapis-kemudian-kelompok: kekalkan baris yang memenuhi syarat, gunakan penambat date - ROW_NUMBER(), kelompokkan, dan gunakan HAVING COUNT(*) >= N. Kaedah ini boleh digeneralisasikan dan menghormati jurang kalendar.
  • Jumlah tetingkap gelongsor: tandakan baris, kemudian jumlahkan merentasi bingkai tetap sebanyak N baris; kemas tetapi berhati-hati dengan perbezaan ROWS dan kalendar pada data yang telah ditapis terlebih dahulu.

Seterusnya: mengira rentetan aktif semasa pengguna pada hari ini.

Percuma untuk bermula

Pelajari Persediaan Temu Duga Pengaturcaraan dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
90
Pelajaran
360

Soalan Lazim

Adakah pelajaran “N Baris Berturutan yang Memenuhi Syarat” percuma?

Ya — teks penuh “N Baris Berturutan yang Memenuhi Syarat” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga Pengaturcaraan, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga Pengaturcaraan merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “N Baris Berturutan yang Memenuhi Syarat”?

Corak tetingkap klasik “tiga hari berturut-turut dengan jualan melebihi X”. Anda berlatih Persediaan Temu Duga Pengaturcaraan menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga Pengaturcaraan?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga Pengaturcaraan di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “N Baris Berturutan yang Memenuhi Syarat” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga Pengaturcaraan ini?

Ya. Setiap pelajaran Persediaan Temu Duga Pengaturcaraan menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Mengesan Hari Kalendar Berturutan
  2. Rentetan Terpanjang bagi Setiap Pengguna
  3. N Baris Berturutan yang Memenuhi Syarat
  4. Rentetan Aktif Semasa Setakat Hari Ini
← Kembali ke Persediaan Temu Duga Pengaturcaraan