5 tipičnih JavaScript zadataka intervjua: analiza i rješenja

5 tipičnih JavaScript zadataka intervjua: analiza i rješenja

Od prevoditelja: objavio članak za vas Maria Antonietta Perna, koja govori o uobičajenim JavaScript zadacima, najčešće se nudi kandidatima za programere tijekom intervjua. Članak će biti koristan, prije svega, programerima početnicima.

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".

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

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.

palindrom('racecar') === istina
palindrom('tablica') === netočno

Analizirajmo zadatak

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.

anagram('finder', 'Friend') —> istina
anagram('zdravo', 'doviđenja') —> lažno

Analizirajmo zadatak

Ono što je važno uzeti u obzir ovdje je da morate provjeriti svako slovo u dva retka unosa i njihov broj u svakom retku.

pronalazač —> 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

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".

Primjer:

pronađiVowels('zdravo') // —> 2
pronađiVowels('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 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.

Postoji kraće rješenje problema:

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

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.

Skillbox preporučuje:

Izvor: www.habr.com

Dodajte komentar