
Od prevodnika: objavili smo članak , koji se najčešće postavljaju kandidatima za programere na intervjuima. Članak će biti koristan prvenstveno za početnike programere.
Intervjui u tehnološkim kompanijama već dugo su postali tema razgovora. Nije iznenađujuće – uspešno prolaziti intervjue pruža mogućnost da se dobije dobra posla. Ali to nije tako jednostavno, budući da često morate rešavati složene zadatke.
Osim toga, većina ovih zadataka često nije povezana sa poslom koji će kandidat obavljati, ali ih je ipak potrebno rešiti. Ponekad ih je potrebno raditi na tabli, bez provere na Google-u ili bilo kojem drugom izvoru. Da, situacija se polako menja, i u nekim kompanijama odustaju od takvih intervjua, ali mnogi poslodavci još uvek drže do ove tradicije. Ovaj članak je posvećen analizi uobičajenih JavaScript zadataka koji se često koriste kao zadaci za kandidate.
Opominjamo: za vse bralce »Habra« — popust 10 000 rubljev ob vpisu na kateri koli tečaj Skillbox s promo kodo »Habr«.
Skillbox priporoča: Praktični tečaj .
Najvažnije je temeljno se pripremiti za vaš intervju.
Da, pre nego što počnemo analizirati zadatke, hajde da razmotrimo opšte savete za pripremu za intervju.
Najvažnije je pripremiti se unapred. Proverite koliko dobro pamtite algoritme i strukture podataka, i osvežite znanje u oblastima koje vam nisu dobro poznate. Postoji mnogo online platformi koje će vam pomoći da se pripremite za prolazak intervjua. Preporučujemo , , in .
Treba naučiti da glasno objašnjavate rešenje. Preporučljivo je da kandidatima pričate o tome šta radite, a ne samo da pišete na tabli (ili kucate kod na računaru, takođe u tišini). Tako, ako napravite grešku u kodu, ali je put do rešenja u načelu ispravan, možete povećati svoje šanse za uspeh.
Treba osmisliti zadatak pre nego što krenete na rešenje. U nekim slučajevima možete površno razumeti zadatak i zatim krenuti pogrešnim putem. Možda vredi postaviti nekoliko pojašnjavajućih pitanja intervjuistu.
Potrebno je vežbati pisanje koda rukom, a ne na računaru. Včasih na razgovorih dajo iskalcu marker in tablo, kjer ni ne namigov ne samodejnega formatiranja. Pri iskanju rešitve je smiselno zapisati svoj kodo na papir ali neposredno na tablo. Če vse držite v glavi, lahko pozabite kaj pomembnega.
Predloga nalog za JavaScript
Verjetno so vam nekatere od teh nalog že znane. Ali ste sodelovali na razgovorih, kjer je bilo potrebno reševati kaj podobnega, ali pa ste se na to pripravljali med učenjem JavaScript. Sedaj je čas, da jih rešite še enkrat, in sicer z podrobnim pojasnilom postopka.
Palindrom
Palindrom je beseda, stavek ali zaporedje znakov, ki se bere popolnoma enako tako naprej kot nazaj. Na primer, 'Anna' je palindrom, medtem ko 'table' in 'John' nista.
Postavitev
Dana je vrstica; potrebno je napisati funkcijo, ki vrne vrednost true, če je vrstica palindrom, in false, če ni. Pri tem je potrebno upoštevati presledke in ločila.
palindrome(‘racecar’) === true
palindrome(‘table’) === false
Razčlenitev naloge
Osnovna ideja tukaj je obrniti vrstico v nasprotno smer. Če je 'obrnjena' vrstica popolnoma identična izvirniku, potem smo dobili palindrom in funkcija mora vrniti true. Če ne, pa false.
Solution
Tukaj je koda, ki omogoča rešitev palindroma.
const palindrome = str => {
// pretvori niz v male črke
str = str.toLowerCase()
// obrni vhodni niz in vrni rezultat
// primerjave
return str === str.split('').reverse().join('')
}Prvi korak je pretvorba znakov vhodnega niza v male črke. To je zagotovilo, da bo program primerjal prav samo znake, ne pa velike ali male črke ali kaj drugega.
Drugi korak je obrnitev niza. To ni težko: potrebno je pretvoriti ga v tabelo s pomočjo metode .split() (knjižnica String). Nato obrnemo tabelo z uporabo .reverse() (knjižnica Array). Zadnji korak je pretvoritev obrnjenega seznama nazaj v niz s pomočjo .join() (knjižnica Array).
Sedaj je vse, kar morate storiti, primerjati 'obrnjen' niz s prvotnim in vrniti rezultat true ali false.
FizzBuzz
Ena najbolj priljubljenih nalog na razgovorih.
Postavitev
Zahteva se, da napišete funkcijo, ki izpiše števila od 1 do n, kjer je n celo število, ki ga funkcija sprejme kot parameter, pod takimi pogoji:
- izpis fizz namesto števil, deljivih s 3;
- izpis buzz namesto števil, deljivih z 5;
- izpis fizzbuzz namesto števil, deljivih tako z 3 kot z 5.
Primer
Fizzbuzz(5)
Результат.
// 1
// 2
// fizz
// 4
// buzz
Razčlenitev naloge
Ključna stvar tukaj je način iskanja deljivih števil s pomočjo JavaScript-a. To lahko izvedemo z uporabo operatorja modulo ali ostanka — %, ki prikazuje ostanek pri deljenju dveh števil. Če je ostanek 0, to pomeni, da je prvo število deljivo z drugim.
12 % 5 // 2 -> 12 ni deljivo z 5
12 % 3 // 0 -> 12 je deljivo z 3
Tako, če delimo 12 z 5, dobimo 2 z ostankom 2. Če pa delimo 12 z 3, dobimo 4 z ostankom 0. V prvem primeru 12 ni deljivo z 5, v drugem — 12 je deljivo z 3.
Solution
Optimalna rešitev bo naslednja koda:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// preveri, če je število deljivo z 3 in 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // preveri, če je število deljivo z 3
else if(i % 3 === 0) {
console.log('fizz')
} // preveri, če je število deljivo z 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}Funkcija izvaja potrebne preverbe z uporabo pogojnih operatorjev in daje rezultat, ki ga uporabnik potrebuje. Pri nalogi je treba biti pozoren na vrstni red operatorjev if…else: začeti z dvojno pogojem (&&) in končati s primerom, ko deljivih števil ni našlo. Tako pokrivamo vse možnosti.
Anagram
Tako imenujemo besedo, ki vsebuje vse črke druge besede v enakem številu, a v drugačnem redu.
Postavitev
Potrebno je napisati funkcijo, ki preverja, ali sta dve nizi anagrami, pri čemer velikost črk ni pomembna. Upošteva se le simbole; presledki ali ločila se ne štejejo.
anagram(‘finder’, ‘Friend’) -> true
anagram(‘hello’, ‘bye’) -> false
Razčlenitev naloge
Pomembno je upoštevati, da je treba preveriti vsako črko v obeh vhodnih nizih in njihovo število v vsakem nizu.
finder -> f: 1 friend -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1
Za shranjevanje podatkov anagramov je smiselno izbrati strukturo, kot je objektni literal JavaScript. Ključ v tem primeru je znak črke, vrednost pa je količina njenega ponavljanja v trenutnem nizu.
Obstajajo tudi druge zahteve:
- Treba je zagotoviti, da velikost črk pri primerjavi ni upoštevana. Preprosto pretvorimo oba niza v malo ali veliko črko.
- Iz primerjave izključimo vse ne-simbole. Najbolje je delati z .
Solution
// 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
}Upoštevajte uporabo v zgoraj prikazanem izrezku. Ta metoda vrne polje, ki vsebuje imena ali ključe v enakem vrstnem redu, kot se pojavijo v objektu. V tem primeru bo polje videti takole:
[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]
Tako dobimo lastnosti objekta brez potrebe po obsežnem zanki. Ta način lahko uporabimo s lastnostjo .length - za preverjanje, ali imata obeh nizov enako število znakov - to je pomembna značilnost anagramov.
Iskanje samoglasnikov
Dokaj preprosta naloga, ki se pogosto pojavi na razgovorih.
Postavitev
Napisati je treba funkcijo, ki sprejme niz kot argument in vrne število samoglasnikov, ki jih vsebuje niz.
Samoglasniki so 'a', 'e', 'i', 'o', 'u'.
Primer:
findVowels(‘hello’) // —> 2
findVowels(‘why’) // —> 0
Solution
Tukaj je najpreprostejša različica:
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 opozoriti na uporabo metode .includes(). Ta je dostopna tako za nize kot za polja. Uporabiti jo je treba, da ugotovimo, ali polje vsebuje določeno vrednost. Ta metoda vrne true, če polje vsebuje navedeno vrednost, in false, če je ni.
Obstaja tudi krajša rešitev težave:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matched.length : 0
}Tukaj se uporablja metoda .match(), ki omogoča učinkovito iskanje. Če se v dano niz kot argumentu pojavi regularni izraz, je vračana vrednost polje ujemajočih se znakov. Če ujemanj ni, pa .match() vrne null.
Fibonacci
Klasična naloga, ki se lahko pojavi na razgovorih različnih ravni. Spomnimo, da je Fibonacci zaporedje niz števil, kjer je vsak naslednji vsota dveh prejšnjih. Tako prvih deset števil izgleda takole: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Postavitev
Napisati je treba funkcijo, ki vrne n-to številko v določenem zaporedju, pri čemer je n število, ki se prenese kot argument funkciji.
fibonacci(3) // —> 2
Ta naloga vključuje izvajanje zanke tolikokrat, kot je navedeno v argumentu, z vračanjem vrednosti na ustrezni poziciji. Ta način postavitve naloge zahteva uporabo zank. Če namesto tega uporabite rekurzijo, bi to lahko bilo všeč anketarju in vam prineslo nekaj dodatnih točk.
Solution
const fibonacci = num => {
// shrani Fibonacci zaporedje, ki ga nameravaš
// generirati znotraj tabele in
// inicializiraj tabelo s prvima dvema
// številkama zaporedja
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// dodaj vsoto dveh števil
// pred pozicijo i v tabeli result
// na konec tabele result
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// vrni zadnjo vrednost v tabeli result
return result[num]
}V tabeli rezultatov sta prvi dve številki v vrsti, saj vsaka vrednost v zaporedju sestoji iz vsote dveh predhodnih števil. Na začetku ni dveh števil, ki bi jih lahko uporabili za pridobitev naslednje številke, zato zanka ne more samodejno generirati njih. Ampak, kot vemo, sta prvi dve številki vedno 0 in 1. Zato lahko ročno inicializiramo tabelo rezultatov.
Kar se tiče rekurzije, pa je tu vse bolj preprosto in zapleteno hkrati:
const fibonacci = num => {
// če je num 0 ali 1, vrni num
if(num < 2) {
return num
}
// rekurzija tukaj
return fibonacci(num - 1) + fibonacci(num - 2)
}Nadaljujemo z klicem fibonacci(), pri čemer posredujemo vse manjša števila kot argumente. Ustavimo se v primeru, ko je posredovani argument 0 ali 1.
Izlaz
Verjetno ste se že srečali z eno od teh nalog, če ste opravili razgovore za delovno mesto frontend- ali JavaScript razvijalca (še posebej, če gre za raven junior). Ampak, če vam niso prišle v roke, bi vam lahko koristile v prihodnosti — najmanj za splošno izobraževanje.
Skillbox priporoča:
- Praktični spletni tečaj .
- Spletni tečaj .
- Практический годовой курс .
Izvor: habr.com
