5 tipičnih nalog intervjuja v JavaScriptu: analiza in rešitve

5 tipičnih nalog intervjuja v JavaScriptu: analiza in rešitve

Od prevajalca: objavil članek za vas Maria Antonietta Perna, ki govori o običajnih nalogah JavaScript, ki se najpogosteje ponuja kandidatom za razvijalce med razgovori. Članek bo koristen predvsem programerjem začetnikom.

Razgovori v tehnoloških podjetjih so že dolgo tema pogovorov. To ne bi smelo biti presenetljivo - uspešno opravljen razgovor vam daje priložnost, da dobite dobro službo. A to ni tako preprosto, saj je pogosto treba rešiti zapletene probleme.

Poleg tega najpogosteje večina teh nalog ni povezana z delom, ki ga bo kandidat opravljal, vendar jih je še vedno treba rešiti. Včasih moraš to narediti na tabli, brez preverjanja pri Googlu ali katerem koli drugem viru. Da, razmere se postopoma spreminjajo in nekatera podjetja opuščajo takšne razgovore, vendar se mnogi delodajalci še vedno držijo te tradicije. Ta članek je posvečen analizi tipičnih JavaScript nalog, ki se pogosto uporabljajo kot naloge za iskalce zaposlitve.

Spomnimo: za vse bralce "Habr" - popust v višini 10 rubljev ob vpisu v kateri koli tečaj Skillbox s promocijsko kodo "Habr".

Skillbox priporoča: Praktični tečaj "Mobilni razvijalec PRO".

Glavna stvar je, da se na razgovor temeljito pripravite.

Da, preden začnemo z ogledom nalog, si poglejmo nekaj splošnih nasvetov za pripravo na razgovor.

Glavna stvar je, da se pripravite vnaprej. Preizkusite, kako dobro si zapomnite algoritme in podatkovne strukture ter izboljšajte svoje znanje na področjih, ki vam niso najbolj znana. Obstaja veliko spletnih platform, ki vam lahko pomagajo pri pripravi na razgovore. Svetujemo geeksforgeeks, Voziček, Intervjuvanje.io и CodeSignal.

Vredno se je naučiti odločitve povedati na glas. Priporočljivo je, da prosilcem poveste, kaj počnete, in ne samo pišete na tablo (ali vtipkate kodo v računalnik, tudi tiho). Tako si lahko povečate možnosti za uspeh, če se zmotite v kodi, vendar je rešitev na splošno pravilna.

Problem morate razumeti, preden ga začnete reševati. V nekaterih primerih lahko nalogo razumete površno in nato zaidete na napačno pot. Morda bi bilo vredno anketarju postaviti nekaj pojasnilnih vprašanj.

Kodo morate vaditi ročno, ne na osebnem računalniku. Zgodi se, da prosilec med razgovori dobi marker in tablo, kjer ni namigov ali samodejnega oblikovanja. Ko iščete rešitev, je vredno zapisati svojo kodo na list papirja ali neposredno na tablo. Če imate vse v glavi, lahko pozabite kaj pomembnega.

Predloge nalog v JavaScriptu

Nekatere od teh nalog verjetno že poznate. Ali ste imeli razgovore, na katerih ste morali rešiti nekaj podobnega, ali pa ste na njih vadili med učenjem JavaScripta. No, zdaj je čas, da jih ponovno rešimo in to s podrobno razlago postopka.

Palindrom

Palindrom je beseda, stavek ali zaporedje znakov, ki se popolnoma enako bere tako v običajni kot v nasprotni smeri. Na primer, »Anna« je palindrom, »miza« in »Janez« pa nista.

Uprizoritev

Glede na niz; napisati morate funkcijo, ki vam omogoča, da vrnete true, če je niz palindrom, in false, če ni. V tem primeru morate upoštevati presledke in ločila.

palindrome('racecar') === res
palindrom('table') === false

Analizirajmo nalogo

Glavna ideja tukaj je obrniti vrvico. Če je "obratni" niz popolnoma enak originalnemu, potem smo prejeli palindrom in funkcija bi morala vrniti true. Če ne, lažno.

odločitev

Tukaj je koda, ki rešuje 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('')
}

Prvi korak je pretvorba znakov v vhodnem nizu v male črke. To je zagotovilo, da bo program primerjal znake same, ne velikih in velikih črk ali karkoli drugega.

Drugi korak je obrniti črto. To ni težko narediti: pretvoriti ga morate v matriko z uporabo metode .split() (knjižnica String). Nato matriko obrnemo z .reverse() (knjižnica matrike). Zadnji korak je pretvorba obratne matrike v niz z uporabo .join() (knjižnica matrik).

Zdaj morate samo primerjati "obraten" niz z izvirnim nizom in vrniti rezultat true ali false.

FizzBuzz

Ena najbolj priljubljenih nalog na razgovorih.

Uprizoritev

Napisati morate funkcijo, ki na konzolo izpisuje števila od 1 do n, kjer je n celo število, ki ga funkcija vzame kot parameter, z naslednjimi pogoji:

  • izpis piskanje namesto večkratnikov 3;
  • namesto števil, ki so večkratniki števila 5, izpiše buzz;
  • fizzbuzz namesto števil, ki so večkratniki 3 in 5.

Primer

Fizzbuzz (5)

Rezultat

// 1
// 2
// šumenje
// 4
//brenčanje

Analizirajmo nalogo

Glavna stvar tukaj je način iskanja večkratnikov z uporabo JavaScripta. Lahko se izvede z uporabo operatorja modula ali ostanka - %, ki vam omogoča prikaz ostanka pri deljenju dveh števil. Če je ostanek 0, pomeni, da je prvo število večkratnik drugega.

12% 5 // 2 -> 12 ni večkratnik 5
12% 3 // 0 -> 12 je večkratnik 3

Če torej 12 delite s 5, dobite 2 z ostankom 2. Če 12 delite s 3, dobite 4 z ostankom 0. V prvem primeru 12 ni večkratnik 5, v drugem pa , 12 je večkratnik 3.

odločitev

Optimalna rešitev bi bila naslednja koda:

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)
    }
  }
}

Funkcija izvede potrebna preverjanja z uporabo pogojnih stavkov in ustvari rezultat, ki ga zahteva uporabnik. V nalogi je vredno biti pozoren na vrstni red stavkov if...else: začnite z dvojnim pogojem (&&) in končajte s primerom, ko več števil ni bilo mogoče najti. Posledično pokrivamo vse možnosti.

Anagram

To je ime za besedo, ki vsebuje vse črke druge besede v istem številu, vendar v drugačnem vrstnem redu.

Uprizoritev

Napisati moramo funkcijo, ki preverja, ali sta dva niza anagrama, pri čemer velike in male črke niso pomembne. Štejejo se samo znaki; presledki ali ločila se ne upoštevajo.

anagram('finder', 'Friend') —> res
anagram('zdravo', 'adijo') —> false

Analizirajmo nalogo

Pomembno je, da tukaj upoštevate, da morate preveriti vsako črko v dveh vnosnih vrsticah in njihovo število v vsaki vrstici.

najditelj —> f: 1 prijatelj —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Če želite shraniti podatke anagrama, morate izbrati strukturo, kot je objektni literal JavaScript. Ključ v tem primeru je znak črke, vrednost je število njenih ponovitev v trenutni vrstici.

Obstajajo še drugi pogoji:

  • Paziti morate, da se pri primerjavi ne upoštevajo veliki in mali črke. Preprosto pretvorimo oba niza v male ali velike črke.
  • Iz primerjave izločimo vse ne-znake. Najboljše za delo regularni izrazi.

odločitev

// 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
}

Bodite pozorni na uporabo Object.keys() v zgornjem delčku. Ta metoda vrne matriko, ki vsebuje imena ali ključe v istem vrstnem redu, kot so prikazani v objektu. V tem primeru bo niz takšen:

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

Na ta način pridobimo lastnosti predmeta, ne da bi morali narediti množično zanko. V težavi lahko uporabite to metodo z lastnostjo .length, da preverite, ali imata oba niza enako število znakov – to je pomembna lastnost anagramov.

Iskanje samoglasnikov

Precej preprosta naloga, ki se pogosto pojavi na intervjujih.

Uprizoritev

Napisati morate funkcijo, ki vzame niz kot argument in vrne število samoglasnikov, ki jih vsebuje niz.
Samoglasniki so "a", "e", "i", "o", "u".

Primer:

najdiVowels('zdravo') // —> 2
najdiVowels('zakaj') // —> 0

odločitev

Tu je najpreprostejša možnost:

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
}

Pomembno je biti pozoren na uporabo metode .includes(). Na voljo je tako za nize kot za nize. Uporabiti ga je treba za ugotavljanje, ali matrika vsebuje določeno vrednost. Ta metoda vrne true, če matrika vsebuje podano vrednost, in false, če je ne vsebuje.

Obstaja krajša rešitev problema:

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

To uporablja metodo .match(), ki vam omogoča izvajanje učinkovitega iskanja. Če je znotraj podanega niza najden regularni izraz kot argument metode, je vrnjena vrednost niz ujemajočih se znakov. No, če ni zadetkov, vrne .match() nič.

Fibonacci

Klasična naloga, ki jo najdemo v intervjujih na različnih ravneh. Velja spomniti, da je Fibonaccijevo zaporedje niz števil, kjer je vsako naslednje vsota prejšnjih dveh. Torej, prvih deset številk je videti takole: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Uprizoritev

Napisati morate funkcijo, ki vrne n-ti zapis v določenem zaporedju, pri čemer je n število, ki je posredovano kot argument funkciji.

fibonacci(3) // —> 2

Ta naloga vključuje hojo skozi zanko tolikokrat, kot je navedeno v argumentu, in vrnitev vrednosti na ustreznem mestu. Ta način postavitve problema zahteva uporabo zank. Če namesto tega uporabite rekurzijo, bo to morda zadovoljilo anketarja in vam prineslo nekaj dodatnih točk.

odločitev

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]
}

V nizu rezultatov sta prvi dve številki vsebovani v nizu, ker je vsak vnos v nizu vsota prejšnjih dveh števil. Na samem začetku ni dveh številk, ki ju je mogoče uporabiti za pridobitev naslednje številke, zato ju zanka ne more ustvariti samodejno. Toda kot vemo, sta prvi dve številki vedno 0 in 1. Zato lahko matriko rezultatov inicializirate ročno.

Kar zadeva rekurzijo, je vse enostavnejše in bolj zapleteno hkrati:

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)
}

Kar naprej kličemo fibonacci() in kot argumente posredujemo vedno manjša števila. Ustavimo se, ko je posredovan argument 0 ali 1.

Izhod

Najverjetneje ste se s katero od teh nalog že srečali, če ste bili na razgovoru za delovno mesto frontend ali JavaScript razvijalca (še posebej, če je na junior ravni). Če pa nanje še niste naleteli, bodo morda koristne v prihodnosti – vsaj za splošni razvoj.

Skillbox priporoča:

Vir: www.habr.com

Dodaj komentar