5 tugas wawancara JavaScript yang khas: analisis dan solusi

5 tugas wawancara JavaScript yang khas: analisis dan solusi

Dari penerjemah: menerbitkan artikel untuk Anda Maria Antonietta Perna, yang berbicara tentang tugas umum JavaScript, paling sering ditawarkan kepada pelamar pengembang selama wawancara. Artikel ini akan bermanfaat, pertama-tama, bagi programmer pemula.

Wawancara di perusahaan teknologi telah lama menjadi perbincangan. Hal ini seharusnya tidak mengherankan - keberhasilan melewati wawancara memberi Anda kesempatan untuk mendapatkan pekerjaan yang baik. Namun hal ini tidaklah mudah, karena permasalahan yang rumit sering kali perlu dipecahkan.

Selain itu, sering kali, sebagian besar tugas ini tidak terkait dengan pekerjaan yang akan dilakukan pelamar, namun masih perlu diselesaikan. Terkadang Anda harus melakukannya di papan, tanpa memeriksa Google atau sumber lainnya. Ya, situasinya berangsur-angsur berubah, dan beberapa perusahaan mengabaikan wawancara semacam itu, namun banyak pengusaha yang masih menganut tradisi ini. Artikel ini dikhususkan untuk analisis tugas-tugas khas JavaScript yang sering digunakan sebagai tugas bagi pencari kerja.

Kami mengingatkan: untuk semua pembaca "Habr" - diskon 10 rubel saat mendaftar di kursus Skillbox apa pun menggunakan kode promosi "Habr".

Skillbox merekomendasikan: Tentu saja praktis "Pengembang Seluler PRO".

Hal utama adalah mempersiapkan wawancara Anda secara menyeluruh.

Ya, sebelum kita mulai melihat tugasnya, mari kita lihat beberapa tip umum persiapan wawancara.

Yang utama adalah mempersiapkan terlebih dahulu. Uji seberapa baik Anda mengingat algoritme dan struktur data, dan tingkatkan pengetahuan Anda di bidang yang belum terlalu Anda pahami. Ada banyak platform online yang dapat membantu Anda mempersiapkan wawancara. Kami menyarankan geeksforgeeks, kereta dorong, Wawancara.io и KodeSinyal.

Penting untuk belajar mengucapkan keputusan itu dengan lantang. Dianjurkan untuk memberi tahu pelamar tentang apa yang Anda lakukan, dan tidak hanya menulis di papan tulis (atau mengetikkan kode ke komputer, juga secara diam-diam). Dengan cara ini, jika Anda membuat kesalahan dalam kode, namun solusinya secara umum benar, Anda dapat meningkatkan peluang keberhasilan.

Anda perlu memahami masalahnya sebelum mulai menyelesaikannya. Dalam beberapa kasus, Anda mungkin memahami suatu tugas secara dangkal dan kemudian mengambil jalan yang salah. Mungkin ada baiknya menanyakan beberapa pertanyaan klarifikasi kepada pewawancara.

Anda perlu berlatih menulis kode dengan tangan, bukan di PC. Kebetulan selama wawancara pelamar diberikan spidol dan papan tulis, di mana tidak ada petunjuk atau pemformatan otomatis. Saat mencari solusi, ada baiknya menuliskan kode Anda di selembar kertas atau langsung di papan tulis. Jika Anda terus memikirkan semuanya, Anda mungkin melupakan sesuatu yang penting.

Tugas templat dalam JavaScript

Beberapa dari tugas ini mungkin sudah tidak asing lagi bagi Anda. Anda pernah melakukan wawancara di mana Anda harus menyelesaikan hal serupa, atau mempraktikkannya sambil mempelajari JavaScript. Nah, sekarang saatnya menyelesaikannya lagi, dan dengan penjelasan detail prosesnya.

Palindrom

Palindrom adalah kata, kalimat, atau rangkaian karakter yang dibaca sama persis baik dalam arah biasa maupun berlawanan arah. Misalnya, “Anna” adalah palindrom, tetapi “meja” dan “John” bukan.

Pementasan

Diberikan sebuah string; Anda perlu menulis fungsi yang memungkinkan Anda mengembalikan nilai true jika stringnya adalah palindrom, dan false jika bukan. Dalam hal ini, Anda perlu memperhitungkan spasi dan tanda baca.

palindrom('mobil balap') === benar
palindrom('tabel') === salah

Mari kita menganalisis tugasnya

Ide utamanya di sini adalah membalikkan string. Jika string "terbalik" benar-benar identik dengan string aslinya, maka kita telah menerima palindrom dan fungsinya akan mengembalikan nilai true. Jika tidak, salah.

keputusan

Berikut adalah kode yang menyelesaikan palindrom.

const palindrome = str => {
  // turn the string to lowercase
  str = str.toLowerCase()
  // reverse input string and return the result of the
  // comparisong
  return str === str.split('').reverse().join('')
}

Langkah pertama adalah mengubah karakter dalam string input menjadi huruf kecil. Ini adalah jaminan bahwa program akan membandingkan karakter itu sendiri, dan bukan huruf besar atau apa pun.

Langkah kedua adalah membalikkan garis. Ini tidak sulit untuk dilakukan: Anda perlu mengubahnya menjadi array menggunakan metode .split() (String Library). Kemudian kita membalikkan array menggunakan .reverse() (Perpustakaan array). Langkah terakhir adalah mengonversi array terbalik menjadi string menggunakan .join() (Perpustakaan array).

Sekarang yang perlu Anda lakukan hanyalah membandingkan string "terbalik" dengan string asli, mengembalikan hasilnya benar atau salah.

FizzBuzz

Salah satu tugas paling populer dalam wawancara.

Pementasan

Anda perlu menulis fungsi yang mencetak angka dari 1 hingga n ke konsol, di mana n adalah bilangan bulat yang dijadikan parameter oleh fungsi tersebut, dengan ketentuan sebagai berikut:

  • keluaran mendesis bukannya kelipatan 3;
  • keluaran buzz alih-alih angka yang merupakan kelipatan 5;
  • keluaran fizzbuzz alih-alih angka yang merupakan kelipatan 3 dan 5.

Contoh

desas-desus(5)

Hasil

// 1
// 2
// mendesis
// 4
//berdengung

Mari kita menganalisis tugasnya

Hal utama di sini adalah cara menemukan kelipatan menggunakan JavaScript. Hal ini dapat diimplementasikan menggunakan operator modulus atau sisanya - %, yang memungkinkan Anda menampilkan sisanya saat membagi dua angka. Jika sisanya 0, berarti bilangan pertama merupakan kelipatan bilangan kedua.

12% 5 // 2 -> 12 bukan kelipatan 5
12% 3 // 0 -> 12 adalah kelipatan 3

Jadi, jika Anda membagi 12 dengan 5, Anda mendapatkan 2 dengan sisa 2. Jika Anda membagi 12 dengan 3, Anda mendapatkan 4 dengan sisa 0. Dalam kasus pertama, 12 bukan kelipatan 5, dalam kasus kedua , 12 adalah kelipatan 3.

keputusan

Solusi optimalnya adalah kode berikut:

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // check if the number is a multiple of 3 and 5
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // check if the number is a multiple of 3
      else if(i % 3 === 0) {
      console.log('fizz')
    } // check if the number is a multiple of 5
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

Fungsi ini melakukan pemeriksaan yang diperlukan menggunakan pernyataan kondisional dan menghasilkan hasil yang dibutuhkan oleh pengguna. Dalam soal ini, perlu diperhatikan urutan pernyataan if...else: dimulai dengan kondisi ganda (&&) dan diakhiri dengan kasus di mana beberapa angka tidak dapat ditemukan. Hasilnya, kami mencakup semua opsi.

Anagram

Ini adalah nama kata yang memuat semua huruf dari kata lain dalam nomor yang sama, tetapi urutannya berbeda.

Pementasan

Kita perlu menulis fungsi yang memeriksa apakah dua string merupakan anagram, dan huruf besar/kecil tidak menjadi masalah. Hanya karakter yang dihitung; spasi atau tanda baca tidak diperhitungkan.

anagram('pencari', 'Teman') —> benar
anagram('halo', 'sampai jumpa') —> salah

Mari kita menganalisis tugasnya

Hal penting yang perlu diperhatikan di sini adalah Anda perlu memeriksa setiap huruf di dua baris masukan dan nomornya di setiap baris.

pencari —> f: 1 teman —> f: 1
saya: 1 hal: 1
n: 1 saya: 1
d: 1 e: 1
e: 1 n: 1
r: 1 hari: 1

Untuk menyimpan data anagram, Anda harus memilih struktur seperti literal objek JavaScript. Kuncinya dalam hal ini adalah karakter hurufnya, nilainya adalah jumlah pengulangannya pada baris saat ini.

Ada syarat lain:

  • Anda perlu memastikan bahwa huruf besar-kecil tidak diperhitungkan saat membandingkan. Kami cukup mengonversi kedua string menjadi huruf kecil atau besar.
  • Kami mengecualikan semua non-karakter dari perbandingan. Terbaik untuk diajak bekerja sama ekspresi reguler.

keputusan

// helper function that builds the
// object to store the data
const buildCharObject = str => {
  const charObj = {}
  for(let char of str.replace(/[^w]/g).toLowerCase()) {
    // if the object has already a key value pair
    // equal to the value being looped over,
    // increase the value by 1, otherwise add
    // the letter being looped over as key and 1 as its value
    charObj[char] = charObj[char] + 1 || 1
  }
  return charObj
}
 
// main function
const anagram = (strA, strB) => {
  // build the object that holds strA data
  const aCharObject = buildCharObject(strA)
  // build the object that holds strB data
  const bCharObject = buildCharObject(strB)
 
  // compare number of keys in the two objects
  // (anagrams must have the same number of letters)
  if(Object.keys(aCharObject).length !== Object.keys(bCharObject).length) {
    return false
  }
  // if both objects have the same number of keys
  // we can be sure that at least both strings
  // have the same number of characters
  // now we can compare the two objects to see if both
  // have the same letters in the same amount
  for(let char in aCharObject) {
    if(aCharObject[char] !== bCharObject[char]) {
      return false
    }
  }
  // if both the above checks succeed,
  // you have an anagram: return true
  return true
}

Perhatikan penggunaannya Object.keys () dalam cuplikan di atas. Metode ini mengembalikan array yang berisi nama atau kunci dalam urutan yang sama dengan kemunculannya di objek. Dalam hal ini arraynya akan menjadi seperti ini:

['f', 'i', 'n', 'd', 'e', ​​​​'r']

Dengan cara ini kita mendapatkan properti objek tanpa harus melakukan perulangan massal. Dalam suatu masalah, Anda dapat menggunakan metode ini dengan properti .length untuk memeriksa apakah kedua string memiliki jumlah karakter yang sama - ini adalah fitur penting dari anagram.

Cari vokal

Sebuah tugas yang cukup sederhana yang sering muncul dalam wawancara.

Pementasan

Anda perlu menulis fungsi yang menggunakan string sebagai argumen dan mengembalikan jumlah vokal yang terkandung dalam string.
Huruf vokalnya adalah “a”, “e”, “i”, “o”, “u”.

Contoh:

findVowels('halo') // —> 2
findVowels('mengapa') // —> 0

keputusan

Inilah opsi paling sederhana:

const findVowels = str => {
  let count = 0
  const vowels = ['a', 'e', 'i', 'o', 'u']
  for(let char of str.toLowerCase()) {
    if(vowels.includes(char)) {
      count++
    }
  }
  return count
}

Penting untuk memperhatikan penggunaan metode .includes(). Ini tersedia untuk string dan array. Ini harus digunakan untuk menentukan apakah suatu array berisi nilai tertentu. Metode ini mengembalikan nilai benar jika array berisi nilai yang ditentukan, dan salah jika tidak.

Ada solusi singkat untuk masalah ini:

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

Ini menggunakan metode .match(), yang memungkinkan Anda menerapkan pencarian yang efisien. Jika ekspresi reguler sebagai argumen metode ditemukan di dalam string yang ditentukan, maka nilai yang dikembalikan adalah array karakter yang cocok. Nah, jika tidak ada yang cocok, maka .match() mengembalikan null.

Fibonacci

Sebuah tugas klasik yang dapat ditemukan dalam wawancara di berbagai tingkatan. Perlu diingat bahwa deret Fibonacci adalah serangkaian angka yang masing-masing angka berikutnya merupakan jumlah dari dua angka sebelumnya. Jadi, sepuluh angka pertama terlihat seperti ini: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Pementasan

Anda perlu menulis fungsi yang mengembalikan catatan ke-n dalam urutan tertentu, dengan n sebagai angka yang diteruskan sebagai argumen ke fungsi tersebut.

fibonacci(3) // —> 2

Tugas ini melibatkan berjalan melalui perulangan beberapa kali yang ditentukan dalam argumen, mengembalikan nilai pada posisi yang sesuai. Cara mengajukan masalah ini memerlukan penggunaan loop. Jika Anda menggunakan rekursi, ini mungkin menyenangkan pewawancara dan memberi Anda beberapa poin tambahan.

keputusan

const fibonacci = num => {
  // store the Fibonacci sequence you're going
  // to generate inside an array and
  // initialize the array with the first two
  // numbers of the sequence
  const result = [0, 1]
 
  for(let i = 2; i <= num; i++) {
    // push the sum of the two numbers
    // preceding the position of i in the result array
    // at the end of the result array
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // return the last value in the result array
  return result[num]
}

Dalam larik hasil, dua angka pertama terdapat dalam rangkaian karena setiap entri dalam barisan merupakan jumlah dari dua angka sebelumnya. Pada awalnya tidak ada dua angka yang dapat diambil untuk mendapatkan angka berikutnya, sehingga loop tidak dapat menghasilkannya secara otomatis. Namun, seperti yang kita ketahui, dua angka pertama selalu 0 dan 1. Oleh karena itu, Anda dapat menginisialisasi array hasil secara manual.

Adapun rekursi, semuanya lebih sederhana dan sekaligus rumit:

const fibonacci = num => {
  // if num is either 0 or 1 return num
  if(num < 2) {
    return num
  }
  // recursion here
  return fibonacci(num - 1) + fibonacci(num - 2)
}

Kami terus memanggil fibonacci(), meneruskan angka yang semakin kecil sebagai argumen. Kami berhenti ketika argumen yang diberikan adalah 0 atau 1.

Keluaran

Kemungkinan besar, Anda pernah menghadapi salah satu tugas ini jika Anda pernah diwawancarai untuk pekerjaan frontend atau pengembang JavaScript (terutama jika itu di tingkat junior). Namun jika Anda belum menemukannya, mungkin berguna di masa depan - setidaknya untuk pengembangan secara umum.

Skillbox merekomendasikan:

Sumber: www.habr.com

Tambah komentar