5 tugas temuduga JavaScript biasa: analisis dan penyelesaian

5 tugas temuduga JavaScript biasa: analisis dan penyelesaian

Daripada penterjemah: menerbitkan artikel untuk anda Maria Antonietta Perna, yang bercakap tentang tugas JavaScript biasa, paling kerap ditawarkan kepada pemohon pemaju semasa temu duga. Artikel itu akan berguna, pertama sekali, kepada pengaturcara baru.

Temu bual di syarikat teknologi telah lama menjadi bualan ramai. Ini tidak sepatutnya mengejutkan - berjaya lulus temu duga memberi anda peluang untuk mendapatkan pekerjaan yang baik. Tetapi ini tidak begitu mudah, kerana masalah kompleks sering perlu diselesaikan.

Lebih-lebih lagi, selalunya, kebanyakan tugas ini tidak berkaitan dengan kerja yang akan dilakukan oleh pemohon, tetapi ia masih perlu diselesaikan. Kadangkala anda perlu melakukannya di papan, tanpa menyemak dengan Google atau mana-mana sumber lain. Ya, keadaan berubah secara beransur-ansur, dan beberapa syarikat meninggalkan temu duga sedemikian, tetapi banyak majikan masih mematuhi tradisi ini. Artikel ini ditumpukan kepada analisis tugasan JavaScript biasa yang sering digunakan sebagai tugasan untuk pencari kerja.

Kami mengingatkan: untuk semua pembaca "Habr" - diskaun sebanyak 10 rubel apabila mendaftar dalam mana-mana kursus Skillbox menggunakan kod promosi "Habr".

Skillbox mengesyorkan: Kursus praktikal "Pro Pembangun Mudah Alih".

Perkara utama ialah membuat persediaan yang menyeluruh untuk temu duga anda.

Ya, sebelum kita mula melihat tugasan, mari kita lihat beberapa tip persediaan temuduga umum.

Perkara utama adalah untuk menyediakan lebih awal. Uji sejauh mana anda mengingati algoritma dan struktur data, dan tingkatkan pengetahuan anda dalam bidang yang anda tidak terlalu biasa. Terdapat banyak platform dalam talian yang boleh membantu anda membuat persediaan untuk temu duga. Kami nasihatkan geeksforgeeks, Pramp, Interviewing.io и KodSignal.

Berbaloi untuk belajar mengatakan keputusan itu dengan lantang. Adalah dinasihatkan untuk memberitahu pemohon tentang apa yang anda lakukan, dan bukan hanya menulis di papan tulis (atau taip kod ke dalam komputer, juga secara senyap). Dengan cara ini, jika anda membuat kesilapan dalam kod, tetapi penyelesaiannya secara amnya betul, anda boleh meningkatkan peluang anda untuk berjaya.

Anda perlu memahami masalah sebelum anda mula menyelesaikannya. Dalam sesetengah kes, anda mungkin memahami tugas secara dangkal dan kemudian pergi ke jalan yang salah. Ia mungkin bernilai bertanya beberapa soalan penjelasan kepada penemuduga.

Anda perlu berlatih menulis kod dengan tangan, bukan pada PC. Ia berlaku bahawa semasa temu duga pemohon diberikan penanda dan papan putih, di mana tiada petunjuk atau pemformatan automatik. Apabila mencari penyelesaian, anda patut menulis kod anda pada sekeping kertas atau terus pada papan. Jika anda menyimpan segala-galanya dalam kepala anda, anda mungkin terlupa sesuatu yang penting.

Tugas templat dalam JavaScript

Beberapa tugasan ini mungkin sudah biasa kepada anda. Anda sama ada telah menjalani temu duga di mana anda perlu menyelesaikan sesuatu yang serupa, atau mempraktikkannya semasa mempelajari JavaScript. Nah, kini tiba masanya untuk menyelesaikannya sekali lagi, dan dengan penjelasan terperinci tentang proses itu.

Palindrom

Palindrom ialah perkataan, ayat atau urutan aksara yang dibaca dengan tepat sama dalam arah biasa dan dalam arah yang bertentangan. Contohnya, "Anna" ialah palindrom, tetapi "jadual" dan "John" bukan.

Pementasan

Diberi rentetan; anda perlu menulis fungsi yang membolehkan anda mengembalikan benar jika rentetan adalah palindrom, dan palsu jika tidak. Dalam kes ini, anda perlu mengambil kira ruang dan tanda baca.

palindrom('kereta lumba') === benar
palindrom('jadual') === palsu

Mari analisa tugasan

Idea utama di sini adalah untuk membalikkan rentetan. Jika rentetan "terbalik" benar-benar sama dengan yang asal, maka kami telah menerima palindrom dan fungsi itu harus kembali benar. Jika tidak, palsu.

keputusan

Berikut ialah kod 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 ialah menukar aksara dalam rentetan input kepada huruf kecil. Ini adalah jaminan bahawa program ini akan membandingkan watak itu sendiri, dan bukan kes atau apa-apa lagi.

Langkah kedua ialah membalikkan baris. Ini tidak sukar untuk dilakukan: anda perlu menukarnya kepada tatasusunan menggunakan kaedah .split() (Pustaka rentetan). Kemudian kita membalikkan tatasusunan menggunakan .reverse() (pustaka tatasusunan). Langkah terakhir ialah menukar tatasusunan terbalik kepada rentetan menggunakan .join() (pustaka tatasusunan).

Sekarang semua yang anda perlu lakukan ialah membandingkan rentetan "terbalik" dengan rentetan asal, mengembalikan keputusan itu benar atau salah.

FizzBuzz

Salah satu tugas paling popular dalam temu duga.

Pementasan

Anda perlu menulis fungsi yang mencetak nombor dari 1 hingga n ke konsol, dengan n ialah integer yang diambil oleh fungsi sebagai parameter, dengan syarat berikut:

  • keluaran desis bukannya gandaan 3;
  • keluarkan buzz dan bukannya nombor yang gandaan 5;
  • keluaran fizzbuzz dan bukannya nombor yang merupakan gandaan bagi kedua-dua 3 dan 5.

Contoh

Fizzbuzz(5)

Keputusan

/ / 1
/ / 2
// desis
/ / 4
//buzz

Mari analisa tugasan

Perkara utama di sini ialah cara untuk mencari gandaan menggunakan JavaScript. Ia boleh dilaksanakan menggunakan operator modulus atau baki - %, yang membolehkan anda menunjukkan baki apabila membahagi dua nombor. Jika bakinya ialah 0, ini bermakna nombor pertama ialah gandaan kedua.

12% 5 // 2 -> 12 bukan gandaan 5
12% 3 // 0 -> 12 ialah gandaan 3

Jadi, jika anda membahagi 12 dengan 5, anda mendapat 2 dengan baki 2. Jika anda membahagi 12 dengan 3, anda mendapat 4 dengan baki 0. Dalam kes pertama, 12 bukan gandaan 5, dalam yang kedua , 12 ialah gandaan 3.

keputusan

Penyelesaian optimum ialah kod 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 melakukan semakan yang diperlukan menggunakan pernyataan bersyarat dan menghasilkan hasil yang diperlukan oleh pengguna. Dalam masalah ini, adalah wajar memberi perhatian kepada susunan pernyataan if...else: mulakan dengan keadaan berganda (&&) dan berakhir dengan kes di mana berbilang nombor tidak dapat ditemui. Akibatnya, kami meliputi semua pilihan.

Anagram

Ini ialah nama untuk perkataan yang mengandungi semua huruf perkataan lain dalam nombor yang sama, tetapi dalam susunan yang berbeza.

Pementasan

Kita perlu menulis fungsi yang menyemak sama ada dua rentetan adalah anagram, dan kes itu tidak penting. Hanya aksara dikira; ruang atau tanda baca tidak diambil kira.

anagram('pencari', 'Kawan') -> benar
anagram('hello', 'bye') -> palsu

Mari analisa tugasan

Perkara penting yang perlu dipertimbangkan di sini ialah anda perlu menyemak setiap huruf dalam dua baris input dan nombor mereka dalam setiap baris.

pencari —> f: 1 rakan —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Untuk menyimpan data anagram, anda harus memilih struktur seperti literal objek JavaScript. Kunci dalam kes ini ialah watak huruf, nilainya ialah bilangan ulangannya dalam baris semasa.

Terdapat syarat lain:

  • Anda perlu memastikan bahawa kes surat tidak diambil kira semasa membandingkan. Kami hanya menukar kedua-dua rentetan kepada huruf kecil atau besar.
  • Kami mengecualikan semua bukan aksara daripada perbandingan. Terbaik untuk bekerjasama ungkapan biasa.

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 coretan di atas. Kaedah ini mengembalikan tatasusunan yang mengandungi nama atau kekunci dalam susunan yang sama yang muncul dalam objek. Dalam kes ini array akan menjadi seperti ini:

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

Dengan cara ini kita mendapat sifat objek tanpa perlu melakukan gelung pukal. Dalam masalah, anda boleh menggunakan kaedah ini dengan sifat .length untuk menyemak sama ada kedua-dua rentetan mempunyai bilangan aksara yang sama - ini ialah ciri penting anagram.

Cari vokal

Tugas yang agak mudah yang sering muncul dalam temuduga.

Pementasan

Anda perlu menulis fungsi yang mengambil rentetan sebagai hujah dan mengembalikan bilangan vokal yang terkandung dalam rentetan.
Vokal tersebut ialah “a”, “e”, “i”, “o”, “u”.

Contoh:

findVowels('hello') // —> 2
findVowels('kenapa') // —> 0

keputusan

Berikut ialah pilihan paling mudah:

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
}

Adalah penting untuk memberi perhatian kepada penggunaan kaedah .includes(). Ia tersedia untuk kedua-dua rentetan dan tatasusunan. Ia harus digunakan untuk menentukan sama ada tatasusunan mengandungi nilai tertentu. Kaedah ini mengembalikan benar jika tatasusunan mengandungi nilai yang ditentukan, dan palsu jika tidak.

Terdapat penyelesaian yang lebih pendek untuk masalah ini:

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

Ini menggunakan kaedah .match(), yang membolehkan anda melaksanakan carian yang cekap. Jika ungkapan biasa sebagai hujah kaedah ditemui dalam rentetan yang ditentukan, maka nilai pulangan ialah tatasusunan aksara yang sepadan. Nah, jika tiada padanan, maka .match() mengembalikan null.

fibonacci

Tugas klasik yang boleh didapati dalam temu bual di pelbagai peringkat. Perlu diingat bahawa jujukan Fibonacci ialah satu siri nombor di mana setiap nombor yang berikutnya adalah hasil tambah dua sebelumnya. Jadi, sepuluh nombor pertama kelihatan seperti ini: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Pementasan

Anda perlu menulis fungsi yang mengembalikan rekod ke-n dalam urutan tertentu, dengan n ialah nombor yang dihantar sebagai hujah kepada fungsi tersebut.

fibonacci(3) // —> 2

Tugas ini melibatkan berjalan melalui gelung bilangan kali yang dinyatakan dalam hujah, mengembalikan nilai pada kedudukan yang sesuai. Cara mengemukakan masalah ini memerlukan penggunaan gelung. Jika anda menggunakan rekursi sebaliknya, ia mungkin menggembirakan penemuduga dan memberi anda beberapa mata 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 tatasusunan keputusan, dua nombor pertama terkandung dalam siri kerana setiap entri dalam jujukan ialah hasil tambah dua nombor sebelumnya. Pada mulanya tidak ada dua nombor yang boleh diambil untuk mendapatkan nombor seterusnya, jadi gelung tidak dapat menjananya secara automatik. Tetapi, seperti yang kita tahu, dua nombor pertama sentiasa 0 dan 1. Oleh itu, anda boleh memulakan tatasusunan hasil secara manual.

Bagi rekursi, semuanya lebih mudah dan lebih rumit pada masa yang sama:

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(), menghantar nombor yang lebih kecil dan lebih kecil sebagai hujah. Kami berhenti apabila hujah yang diluluskan adalah 0 atau 1.

Output

Kemungkinan besar, anda telah pun menghadapi mana-mana tugasan ini jika anda telah ditemuduga untuk tugas pembangun bahagian hadapan atau JavaScript (terutamanya jika ia berada di peringkat junior). Tetapi jika anda belum menemuinya, ia mungkin berguna pada masa hadapan - sekurang-kurangnya untuk pembangunan umum.

Skillbox mengesyorkan:

Sumber: www.habr.com

Tambah komen