Razgovori u tehnološkim tvrtkama dugo su bili glavna tema. To ne treba čuditi – uspješno položen intervju daje vam priliku da dobijete dobar posao. Ali to nije tako jednostavno, jer često treba riješiti složene probleme.
Štoviše, najčešće većina tih zadataka nije vezana uz posao koji će kandidat obavljati, ali ih ipak treba riješiti. Ponekad to morate učiniti na ploči, bez provjere s Googleom ili bilo kojim drugim izvorom. Da, situacija se postupno mijenja, a neke tvrtke napuštaju takve intervjue, ali mnogi poslodavci i dalje se pridržavaju ove tradicije. Ovaj je članak posvećen analizi tipičnih JavaScript zadataka koji se često koriste kao zadaci za tražitelje posla.
Podsjećamo:za sve čitatelje "Habra" - popust od 10 000 rubalja pri upisu na bilo koji tečaj Skillbox koristeći promotivni kod "Habr".
Glavna stvar je da se temeljito pripremite za intervju.
Da, prije nego počnemo gledati zadatke, pogledajmo neke općenite savjete za pripremu intervjua.
Glavna stvar je pripremiti se unaprijed. Testirajte koliko dobro pamtite algoritme i strukture podataka te unaprijedite svoje znanje u područjima koja vam nisu previše poznata. Postoje mnoge online platforme koje vam mogu pomoći da se pripremite za intervjue. Savjetujemo geeksforgeeks, kolica, Intervjuiranje.io и CodeSignal.
Vrijedno je naučiti izgovoriti odluku naglas. Preporučljivo je reći kandidatima o tome što radite, a ne samo pisati na ploču (ili upisivati kod u računalo, također tiho). Na ovaj način, ako pogriješite u kodu, ali je rješenje općenito ispravno, možete povećati svoje šanse za uspjeh.
Morate razumjeti problem prije nego što ga počnete rješavati. U nekim slučajevima možete površno shvatiti zadatak i onda krenuti krivim putem. Možda bi bilo vrijedno postaviti nekoliko razjašnjavajućih pitanja ispitivaču.
Morate vježbati pisanje koda ručno, a ne na računalu. Dešava se da tijekom intervjua podnositelju zahtjeva daju marker i bijelu ploču, na kojoj nema savjeta ili automatskog formatiranja. Kada tražite rješenje, vrijedi zapisati svoj kod na komad papira ili izravno na ploču. Ako sve držite u glavi, mogli biste zaboraviti nešto važno.
Predložak zadataka u JavaScriptu
Neki od ovih zadataka vjerojatno su vam već poznati. Ili ste imali intervjue na kojima ste morali riješiti nešto slično ili ste na njima vježbali dok ste učili JavaScript. Pa, sada je vrijeme da ih ponovno riješite, uz detaljno objašnjenje procesa.
Palindrom
Palindrom je riječ, rečenica ili niz znakova koji se čitaju potpuno isto i u uobičajenom smjeru i u suprotnom smjeru. Na primjer, "Anna" je palindrom, ali "stol" i "Ivan" nisu.
skele
S obzirom na niz; trebate napisati funkciju koja vam omogućuje vraćanje true ako je niz palindrom, i false ako nije. U ovom slučaju morate uzeti u obzir razmake i interpunkcijske znakove.
Glavna ideja ovdje je obrnuti niz. Ako je “obrnuti” niz potpuno identičan originalnom, tada smo primili palindrom i funkcija bi trebala vratiti true. Ako nije, lažno.
odluka
Evo koda koji rješava 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 pretvaranje znakova u ulaznom nizu u mala slova. To je jamstvo da će program usporediti same znakove, a ne mala i velika slova ili bilo što drugo.
Drugi korak je okretanje linije. To nije teško učiniti: morate ga pretvoriti u niz pomoću metode .split() (biblioteka String). Zatim preokrećemo niz pomoću .reverse() (biblioteka nizova). Posljednji korak je pretvaranje obrnutog niza u niz pomoću .join() (biblioteka nizova).
Sada sve što trebate učiniti je usporediti "obrnuti" niz s izvornim nizom, vraćajući rezultat true ili false.
FizzBuzz
Jedan od najpopularnijih zadataka na intervjuima.
skele
Morate napisati funkciju koja ispisuje brojeve od 1 do n na konzolu, gdje je n cijeli broj koji funkcija uzima kao parametar, uz sljedeće uvjete:
izlaz fizz umjesto višekratnika od 3;
izlaz buzz umjesto brojeva koji su višekratnici 5;
fizzbuzz izlaz umjesto brojeva koji su višekratnici i 3 i 5.
Primjer
Fizzbuzz (5)
Rezultirati
// 1
// 2
// pjevušiti
// 4
//zujati
Analizirajmo zadatak
Ovdje je glavna stvar način pronalaženja višekratnika pomoću JavaScripta. Može se implementirati pomoću operatora modula ili ostatka - %, koji vam omogućuje prikaz ostatka pri dijeljenju dva broja. Ako je ostatak 0, to znači da je prvi broj višekratnik drugog.
12% 5 // 2 -> 12 nije višekratnik broja 5
12% 3 // 0 -> 12 je višekratnik od 3
Dakle, ako podijelite 12 s 5, dobit ćete 2 s ostatkom 2. Ako podijelite 12 s 3, dobit ćete 4 s ostatkom 0. U prvom slučaju 12 nije višekratnik broja 5, u drugom slučaju , 12 je višekratnik broja 3.
odluka
Optimalno rješenje bi bio sljedeći kod:
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 izvodi potrebne provjere korištenjem uvjetnih naredbi i proizvodi rezultat koji zahtijeva korisnik. U problemu je vrijedno obratiti pažnju na redoslijed if...else naredbi: započeti dvostrukim uvjetom (&&) i završiti slučajem kada se više brojeva ne može pronaći. Kao rezultat toga, pokrivamo sve opcije.
Anagram
Ovo je naziv za riječ koja sadrži sva slova druge riječi u istom broju, ali drugačijim redoslijedom.
skele
Moramo napisati funkciju koja provjerava jesu li dva niza anagrami, a velika i mala slova nisu bitna. Broje se samo znakovi; razmaci ili interpunkcijski znakovi se ne uzimaju u obzir.
Za pohranu podataka anagrama trebali biste odabrati strukturu kao što je literal JavaScript objekta. Ključ u ovom slučaju je znak slova, vrijednost je broj njegovih ponavljanja u trenutnom retku.
Postoje i drugi uvjeti:
Morate paziti da se velika i velika slova ne uzimaju u obzir prilikom uspoređivanja. Oba niza jednostavno pretvaramo u mala ili velika slova.
Iz usporedbe isključujemo sve ne-karaktere. Najbolje za raditi regularni izrazi.
odluka
// 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
}
Obratite pozornost na uporabu Object.keys() u gornjem isječku. Ova metoda vraća niz koji sadrži imena ili ključeve istim redoslijedom kojim se pojavljuju u objektu. U ovom slučaju niz će biti ovakav:
['f', 'i', 'n', 'd', 'e', 'r']
Na ovaj način dobivamo svojstva objekta bez potrebe za skupnom petljom. U problemu možete koristiti ovu metodu sa svojstvom .length da provjerite imaju li oba niza isti broj znakova - ovo je važna značajka anagrama.
Traži samoglasnike
Prilično jednostavan zadatak koji se često pojavljuje na intervjuima.
skele
Morate napisati funkciju koja uzima niz kao argument i vraća broj samoglasnika koji se nalaze u nizu.
Samoglasnici su "a", "e", "i", "o", "u".
Važno je obratiti pozornost na korištenje metode .includes(). Dostupan je i za nizove i za nizove. Trebalo bi se koristiti za određivanje sadrži li niz određenu vrijednost. Ova metoda vraća true ako niz sadrži navedenu vrijednost, a false ako je ne sadrži.
Ovo koristi metodu .match(), koja vam omogućuje implementaciju učinkovitog pretraživanja. Ako se regularni izraz kao argument metode nalazi unutar navedenog niza, tada je povratna vrijednost niz odgovarajućih znakova. Pa, ako nema podudaranja, onda .match() vraća null.
Fibonacci
Klasičan zadatak koji se može naći u intervjuima na raznim razinama. Vrijedno je podsjetiti da je Fibonaccijev niz niz brojeva gdje je svaki sljedeći zbroj prethodna dva. Dakle, prvih deset brojeva izgleda ovako: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
skele
Morate napisati funkciju koja vraća n-ti zapis u određenom nizu, pri čemu je n broj koji se prosljeđuje kao argument funkciji.
fibonacci(3) // —> 2
Ovaj zadatak uključuje hodanje kroz petlju onoliko puta koliko je navedeno u argumentu, vraćajući vrijednost na odgovarajuće mjesto. Ovakav način postavljanja problema zahtijeva korištenje petlji. Ako umjesto toga koristite rekurziju, to bi moglo zadovoljiti anketara i dati vam nekoliko dodatnih bodova.
odluka
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]
}
U nizu rezultata, prva dva broja sadržana su u nizu jer je svaki unos u nizu zbroj prethodna dva broja. Na samom početku ne postoje dva broja koja se mogu uzeti da bi se dobio sljedeći broj, tako da ih petlja ne može automatski generirati. Ali, kao što znamo, prva dva broja su uvijek 0 i 1. Stoga, polje rezultata možete inicijalizirati ručno.
Što se tiče rekurzije, sve je jednostavnije i kompliciranije u isto vrijeme:
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)
}
Stalno pozivamo fibonacci(), prosljeđujući sve manje i manje brojeve kao argumente. Zaustavljamo se kada je proslijeđeni argument 0 ili 1.
Izlaz
Najvjerojatnije ste se već susreli s bilo kojim od ovih zadataka ako ste bili na razgovoru za posao frontend ili JavaScript developera (osobito ako je na juniorskoj razini). Ali ako niste naišli na njih, mogli bi vam biti korisni u budućnosti - barem za opći razvoj.