5 Uobičajeni problemi na JavaScript intervjuu: analiza i rješenja

5 Uobičajeni problemi na JavaScript intervjuu: analiza i rješenja

Od prevodioca: objavio članak za vas Maria Antonietta Perna, koja govori o tipičnim JavaScript zadacima, koji se najčešće nudi kandidatima-programerima na intervjuima. Članak će prije svega biti koristan programerima početnicima.

O intervjuima u tehnološkim kompanijama se dugo priča u gradu. To nije iznenađujuće - uspješan završetak intervjua omogućava vam da dobijete dobar posao. Ali to nije tako lako, jer je često potrebno riješiti složene probleme.

Štaviše, najčešće većina ovih zadataka nije vezana za posao koji će aplikant obavljati, ali ih ipak treba riješiti. Ponekad to morate učiniti na tabli, bez provjere sa Google-om ili bilo kojim drugim izvorom. Da, situacija se postepeno mijenja, u nekim kompanijama odbijaju takve razgovore, ali mnogi poslodavci se i dalje pridržavaju te tradicije. Ovaj članak je posvećen analizi tipičnih JavaScript zadataka koji se često koriste kao zadaci za kandidate.

Podsećamo: za sve čitaoce "Habra" - popust od 10 rubalja pri upisu na bilo koji Skillbox kurs koristeći "Habr" promotivni kod.

Skillbox preporučuje: Praktični kurs "Mobile Developer PRO".

Glavna stvar je da se pažljivo pripremite za intervju.

Da, prije nego počnemo raščlanjivati ​​zadatke, pogledajmo neke općenite savjete za pripremu za intervju.

Glavna stvar je pripremiti se unaprijed. Provjerite koliko dobro pamtite algoritme i strukture podataka i poboljšajte svoje znanje u područjima koja vam nisu baš poznata. Postoje mnoge online platforme koje vam mogu pomoći da se pripremite za intervjue. Savjetujemo geeksforgeeks, Pramp, Interviewing.io и CodeSignal.

Vrijedi naučiti izgovarati odluku naglas. Preporučljivo je da kandidatima kažete šta radite, a ne samo da pišete na tabli (ili kucate kod na računaru, takođe u tišini). Stoga, ako pogriješite u kodu, ali je rješenje općenito ispravno, možete povećati svoje šanse za uspjeh.

Problem treba razumjeti prije nego što se započne rješavanje. U nekim slučajevima možete površno razumjeti zadatak i onda krenuti pogrešnim putem. Možda bi bilo vredno postaviti nekoliko pojašnjavajućih pitanja ispitivaču.

Morate vježbati pisanje koda ručno, a ne na PC-u. Dešava se da se na intervjuima kandidatu daju marker i tabla na kojoj nema upita ili automatskog formatiranja. Kada tražite rješenje, zapišite svoj kod na komad papira ili direktno na ploču. Ako sve držite u glavi, možete zaboraviti nešto važno.

Zadaci predloška u JavaScriptu

Vjerovatno ste već upoznati s nekim od ovih zadataka. Ili ste uzimali intervjue na kojima ste morali riješiti nešto slično, ili ste vježbali na njima dok ste učili JavaScript. E, sad je vrijeme da ih ponovno riješimo, i to sa detaljnim objašnjenjem procesa.

Palindrom

Palindrom je riječ, rečenica ili niz znakova koji se čita na potpuno isti način i u uobičajenom smjeru i u suprotnom smjeru. Na primjer, "Anna" je palindrom, ali "sto" i "John" nisu.

Inscenacija

Dat niz; morate napisati funkciju koja vam omogućava da vratite true ako je niz palindrom, i false u suprotnom. U tom slučaju moraju se uzeti u obzir razmaci i znakovi interpunkcije.

palindrome('racecar') === istina
palindrome('table') === netačno

Raščlanjivanje zadatka

Glavna ideja ovdje je okrenuti žicu unazad. Ako je "obrnuti" niz potpuno identičan originalnom, onda smo dobili palindrom i funkcija bi trebala vratiti true. Ako nije, netačno.

odluka

Evo koda koji vam omogućava da riješite 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 ulaznog niza u mala slova. Ovo je garancija da će program upoređivati ​​tačno same znakove, a ne mala slova ili nešto drugo.

Drugi korak je obrnuto od linije. Ovo je lako učiniti: potrebno je da ga konvertujete u niz koristeći metodu .split() (biblioteka stringova). Zatim obrćemo niz koristeći .reverse() (biblioteka niza). Poslednji korak je pretvaranje obrnutog niza u string pomoću .join() (biblioteka niza).

Sada sve što je potrebno je uporediti "obrnuti" niz sa originalnim, vraćajući rezultat true ili false.

fizzbuzz

Jedan od najpopularnijih intervjua za posao.

Inscenacija

Potrebno je napisati funkciju koja prikazuje brojeve od 1 do n na konzoli, gdje je n cijeli broj koji funkcija uzima kao parametar, uz sljedeće uvjete:

  • izlaz fizz umjesto umnožaka 3;
  • zujanje izlaz umjesto višekratnika od 5;
  • fizzbuzz izlaz umjesto višekratnika 3 i 5.

Primjer:

Fizzbuzz(5)

rezultat

// 1
// 2
// fizz
// 4
//buzz

Raščlanjivanje zadatka

Glavna stvar ovdje je način pronalaženja višestrukih pomoću JavaScripta. Može se implementirati pomoću operatora modula ili ostatka -%, što vam omogućava da prikažete ostatak prilikom dijeljenja 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šestruko od 3

Dakle, ako podijelimo 12 sa 5, dobićemo 2 sa ostatkom od 2. Ako podijelimo 12 sa 3, onda ćemo dobiti 4 s ostatkom od 0. U prvom slučaju, 12 nije višekratnik od 5, u drugo, 12 je višekratnik broja 3.

odluka

Najbolje 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 obavlja potrebne provjere korištenjem uvjetnih izraza i proizvodi rezultat koji zahtijeva korisnik. U zadatku vrijedi obratiti pažnju na redoslijed naredbi if...else: počevši od dvostrukog uvjeta (&&) i završavajući slučajem kada više brojeva nije moguće pronaći. Kao rezultat, pokrivamo sve opcije.

Anagram

Ovo je naziv riječi koja sadrži sva slova druge riječi u istom broju, ali drugačijim redoslijedom.

Inscenacija

Moramo napisati funkciju koja provjerava da li su dva niza anagrami, a velika i mala slova nisu bitna. Računaju se samo znakovi; razmaci ili znaci interpunkcije se ne uzimaju u obzir.

anagram('finder', 'Friend') --> istina
anagram('zdravo', 'ćao') --> lažno

Raščlanjivanje zadatka

Ovdje je važno uzeti u obzir da je potrebno provjeriti svako slovo u dva ulazna reda i njihov broj u svakom redu.

pronalazač -> ž: 1 prijatelj -> ž: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Za pohranjivanje anagramskih podataka, trebali biste odabrati strukturu kao što je literal JavaScript objekta. Ključ u ovom slučaju je karakter slova, vrijednost je broj njegovih ponavljanja u trenutnom redu.

Postoje i drugi uslovi:

  • Morate biti sigurni da se velika i mala slova ne uzimaju u obzir prilikom poređenja. Samo pretvorite oba niza u mala ili velika slova.
  • Iz poređenja isključujemo sve ne-karaktere. Najbolje za rad 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 pažnju na upotrebu Object.keys() u isječku iznad. Ova metoda vraća niz koji sadrži imena ili ključeve istim redoslijedom kako se pojavljuju u objektu. U ovom slučaju, niz će biti ovakav:

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

Na ovaj način dobijamo svojstva objekta bez potrebe da radimo veliku petlju. U zadatku možete koristiti ovu metodu sa svojstvom .length – da biste provjerili da li oba niza imaju isti broj znakova – ovo je važna karakteristika anagrama.

Pretraga samoglasnika

Prilično jednostavan zadatak koji se često sreće na intervjuima.

Inscenacija

Morate napisati funkciju koja uzima niz kao argument i vraća broj samoglasnika koje niz sadrži.
Samoglasnici su "a", "e", "i", "o", "u".

Primjer:

findVowels('zdravo') // --> 2
findVowels('zašto') // --> 0

odluka

Evo najjednostavnije opcije:

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
}

Važno je obratiti pažnju na upotrebu metode .includes(). Dostupan je i za nizove i za nizove. Trebalo bi se koristiti da se sazna da li niz sadrži određenu vrijednost. Ova metoda vraća true ako niz sadrži navedenu vrijednost i false u suprotnom.

Postoji i kraće rješenje problema:

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

Ovdje se koristi metoda .match(), koja vam omogućava da implementirate efikasnu pretragu. Ako se regularni izraz kao argument metode nađe 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 ispuniti na intervjuima različitih nivoa. Vrijedi podsjetiti da je Fibonačijev niz niz brojeva, gdje je svaki sljedeći zbir prethodna dva. Dakle, prvih deset brojeva izgleda ovako: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Inscenacija

Morate napisati funkciju koja vraća n-ti zapis u određenom nizu, a n je broj koji se prosljeđuje kao argument funkciji.

fibonači (3) // --> 2

Ovaj zadatak uključuje petlju kroz broj puta naveden u argumentu, vraćajući vrijednost na odgovarajuću poziciju. Ovaj način postavljanja problema zahtijeva korištenje petlji. Ako umjesto toga koristite rekurziju, intervjueru bi se to moglo svidjeti i dati vam nekoliko dodatnih poena.

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 nalaze se u redu jer se svaki unos u nizu sastoji od zbira prethodna dva broja. Ne postoje dva broja na samom početku 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 možete ručno inicijalizirati niz rezultata.

Što se tiče rekurzije, sve je jednostavnije i složenije 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)
}

Nastavljamo da pozivamo fibonacci(), prenoseći sve manje brojeve kao argumente. Zaustavljamo se kada je proslijeđeni argument 0 ili 1.

zaključak

Najvjerovatnije ste se već suočili sa nekim od ovih zadataka ako ste bili na razgovoru za posao frontend ili JavaScript programera (posebno ako je riječ o juniorskom nivou). Ali ako niste naišli na njih, mogli bi vam dobro doći u budućnosti - barem za opći razvoj.

Skillbox preporučuje:

izvor: www.habr.com

Dodajte komentar