- Pengujian Needle In A Haystack console memverifikasi solusi pencarian substring Anda dalam hitungan detik
- Soal ini meminta indeks pertama di mana needle muncul di dalam haystack, atau -1
- Dua solusi: sliding window manual dengan loop bersarang dan
indexOfbawaan - Uji dengan dua pasangan contoh: "pineapple pie" / "apple" dan "a coffee bean" / "tea"
- Output console yang diharapkan: 4 untuk kecocokan, -1 untuk tidak ada kecocokan
Ringkasan Masalah dan Alur Kerja Console
Tantangan Needle In A Haystack adalah latihan wawancara coding klasik: diberikan dua string bernama needle dan haystack, kembalikan indeks di mana needle pertama kali muncul di dalam haystack. Jika tidak muncul, kembalikan -1. Console adalah siklus umpan balik tercepat Anda — tulis fungsinya, log dua panggilan uji, jalankan file di terminal, dan baca hasilnya secara langsung.
Sorotan Video:
- Pernyataan masalah: kembalikan indeks pertama
needledi dalamhaystack, atau -1 - Solusi 1: loop
forbersarang yang bergeser karakter demi karakter di sepanjang string - Solusi 2: jalan pintas satu baris menggunakan metode bawaan
indexOf - Pasangan uji: "pineapple pie" dengan "apple" (kecocokan di indeks 4), dan "a coffee bean" dengan "tea" (tidak ada kecocokan, -1)
- Kasus tepi: needle kosong mengembalikan 0 berdasarkan konvensi
Sebelum menulis logika apa pun, atur variabel uji Anda. Ini menjaga sesi console Anda tetap terorganisir dan dapat direproduksi:
const h1 = "pineapple pie";
const n1 = "apple";
const h2 = "a coffee bean";
const n2 = "tea";
| Pasangan Uji | Haystack | Needle | Output yang Diharapkan | Alasan |
|---|---|---|---|---|
| 1 | pineapple pie | apple | 4 | "apple" dimulai di indeks 4 |
| 2 | a coffee bean | tea | -1 | "tea" tidak pernah muncul |
Jaga nama variabel seperti h1, n1, h2, n2 tetap konsisten di setiap eksekusi console. Saat Anda membandingkan output antara solusi manual dan yang dioptimalkan, nama yang cocok membuat ketidaksesuaian terlihat jelas dalam sekali lihat.
Solusi 1: Sliding Window Manual
Pendekatan pertama bergeser di sepanjang string besar dan membandingkan karakter demi karakter. Di setiap posisi awal, periksa karakter berikutnya terhadap needle. Kecocokan penuh pertama memberikan jawabannya; jika pemindaian selesai tanpa kecocokan, kembalikan -1.
function findNeedle(haystack, needle) {
if (needle.length === 0) return 0;
for (let i = 0; i <= haystack.length - needle.length; i++) {
let match = true;
for (let j = 0; j < needle.length; j++) {
if (haystack[i + j] !== needle[j]) {
match = false;
break;
}
}
if (match) return i;
}
return -1;
}
Keputusan struktural utama dalam solusi ini:
| Komponen | Peran | Detail |
|---|---|---|
| Pemeriksaan batas | Kasus tepi | Needle kosong segera mengembalikan 0 |
| Loop luar | Indeks awal | Berjalan selama i <= haystack.length - needle.length |
| Flag kecocokan | Asumsi | Dimulai true, berubah ke false saat tidak cocok |
| Loop dalam | Perbandingan | Menelusuri karakter needle, break menghentikan lebih awal |
| Kembalikan -1 | Gagal | Loop luar selesai tanpa kecocokan penuh |
Kondisi loop luar harus i <= haystack.length - needle.length. Kesalahan off-by-one di sini bisa melewatkan posisi awal yang valid di akhir string atau membaca melewati string dan membuat pengujian console Anda error.
Solusi 2: Dioptimalkan dengan indexOf
Alih-alih menulis loop bersarang secara manual, gunakan pencarian bawaan. Memanggil indexOf pada haystack dengan needle mengembalikan indeks awal pertama jika ada, atau -1 jika tidak ada.
function findNeedleIndex(haystack, needle) {
if (needle.length === 0) return 0;
return haystack.indexOf(needle);
}
Manual (findNeedle)
- Loop for bersarang dengan flag kecocokan
- Menunjukkan bahwa Anda memahami algoritmanya
- Jawaban terbaik saat diminta "implementasikan sendiri"
- Kompleksitas waktu O(n × m)
Dioptimalkan (findNeedleIndex)
- Return satu baris dengan
indexOf - Kode lebih bersih, lebih sedikit rawan kesalahan
- Jawaban terbaik saat kecepatan penyelesaian penting
- Output identik pada semua pasangan uji
Dalam wawancara langsung, sajikan solusi manual terlebih dahulu untuk menunjukkan pemikiran algoritmik, lalu tawarkan versi indexOf sebagai pilihan produksi yang lebih bersih. Keduanya mengembalikan hasil yang sama, jadi katakan secara eksplisit — ini menunjukkan bahwa Anda telah memverifikasi kesetaraannya.
Pengujian Console Langkah demi Langkah
Jalankan kedua solusi melalui alur kerja console yang sama agar Anda dapat mengonfirmasi perilaku identik sebelum menyatakan salah satunya selesai.
Definisikan variabel uji
Buat h1 = "pineapple pie", n1 = "apple", h2 = "a coffee bean", n2 = "tea" di bagian atas file Anda agar setiap solusi diuji dengan input yang identik.
Log solusi manual
Tulis console.log(findNeedle(h1, n1)) dan console.log(findNeedle(h2, n2)) untuk menjalankan jalur loop bersarang.
Jalankan file di terminal
Eksekusi file dengan Node dan baca outputnya. Hasil yang diharapkan secara berurutan: 4, lalu -1.
Log solusi yang dioptimalkan
Tambahkan console.log(findNeedleIndex(h1, n1)) dan console.log(findNeedleIndex(h2, n2)), lalu jalankan ulang. Output harus cocok: 4 dan -1.
Konfirmasi kesetaraan dan rapikan
Jika kedua solusi sepakat di setiap pasangan, implementasi Anda terverifikasi. Hapus log duplikat atau biarkan berlabel untuk referensi di masa mendatang.
| Panggilan Console | Solusi | Output yang Diharapkan |
|---|---|---|
| findNeedle(h1, n1) | Manual | 4 |
| findNeedle(h2, n2) | Manual | -1 |
| findNeedleIndex(h1, n1) | Dioptimalkan | 4 |
| findNeedleIndex(h2, n2) | Dioptimalkan | -1 |
Saat keempat panggilan console mencetak 4, -1, 4, -1 secara berurutan, kedua implementasi dikonfirmasi setara dan benar untuk pasangan uji ini. Itu adalah lampu hijau Anda untuk melanjutkan.
Checklist Latihan dan Kesalahan Umum
Tonggak Penguasaan:
- Implementasikan solusi sliding-window manual dari ingatan
- Tangani kasus tepi needle kosong (kembalikan 0)
- Tulis one-liner indexOf dan jelaskan mengapa ia bekerja
- Jalankan kedua solusi di console dan konfirmasi output identik
- Jelaskan perbedaan kompleksitas waktu dengan lantang
Kesalahan umum yang mengganggu eksekusi console:
| Jebakan | Gejala | Perbaikan |
|---|---|---|
Batas loop salah (< alih-alih <=) | Melewatkan kecocokan di akhir string | Gunakan i <= haystack.length - needle.length |
Tidak ada break saat tidak cocok | Lebih lambat, hasil sama tapi boros | Tambahkan break setelah mengatur match = false |
| Lupa pemeriksaan needle kosong | Output tak terduga untuk "" | Kembalikan 0 saat needle.length === 0 |
| Menukar argumen | Selalu -1 | Jaga urutannya: findNeedle(haystack, needle) |
Salah ketik seperti haststack | ReferenceError di console | Gunakan ejaan yang konsisten: haystack |
Kesalahan console yang sering terjadi dalam latihan ini adalah mengetik haststack di dalam fungsi sementara pemanggilnya mengirimkan haystack. JavaScript memperlakukannya sebagai variabel tidak terdefinisi jika dideklarasikan salah, atau diam-diam membuat bug — periksa ejaan di kedua tempat.
FAQ
Q: Apa yang sebenarnya diverifikasi oleh pengujian console Needle In A Haystack?
Ini memverifikasi bahwa fungsi Anda mengembalikan indeks pertama di mana needle muncul di dalam haystack, atau -1 saat tidak ada kecocokan. Dengan pasangan uji standar, eksekusi yang benar mencetak 4 untuk 'apple' di 'pineapple pie' dan -1 untuk 'tea' di 'a coffee bean'.
Q: Mengapa needle kosong mengembalikan 0?
Berdasarkan konvensi, string kosong dianggap muncul di awal string apa pun, yaitu indeks 0. Baik solusi manual maupun berbasis indexOf memasukkan pemeriksaan ini agar outputnya tetap konsisten.
Q: Solusi mana yang sebaiknya saya berikan dalam wawancara?
Mulailah dengan versi loop bersarang manual untuk menunjukkan bahwa Anda memahami algoritma yang mendasarinya, lalu sajikan versi indexOf sebagai alternatif yang lebih bersih dan siap produksi. Menyebutkan bahwa keduanya menghasilkan output console yang identik akan memperkuat jawaban Anda.
Q: Berapa kompleksitas waktu dari setiap pendekatan?
Solusi sliding-window manual berjalan dalam O(n × m), di mana n adalah panjang haystack dan m adalah panjang needle, karena setiap posisi awal dapat membandingkan hingga m karakter. Versi indexOf mendelegasikan pekerjaan ke pencarian bawaan bahasa.