5 typických úloh pohovoru v JavaScripte: analýza a riešenia

5 typických úloh pohovoru v JavaScripte: analýza a riešenia

Od prekladateľa: publikoval pre vás článok Maria Antonietta Perna, ktorá hovorí o bežných úlohách JavaScriptu, najčastejšie ponúkané developerským žiadateľom počas pohovorov. Článok bude užitočný predovšetkým pre začínajúcich programátorov.

O rozhovoroch v technologických spoločnostiach sa už dlho hovorí v meste. To by nemalo byť prekvapujúce - úspešné absolvovanie pohovoru vám dáva príležitosť získať dobrú prácu. Ale to nie je také jednoduché, pretože často je potrebné riešiť zložité problémy.

Väčšina týchto úloh navyše väčšinou nesúvisí s prácou, ktorú bude žiadateľ vykonávať, no treba ich ešte vyriešiť. Niekedy to musíte urobiť na nástenke bez toho, aby ste to overili na Googli alebo inom zdroji. Áno, situácia sa postupne mení a niektoré firmy od takýchto pohovorov upúšťajú, no mnohí zamestnávatelia sa tejto tradície stále držia. Tento článok je venovaný analýze typických úloh JavaScriptu, ktoré sa často používajú ako úlohy pre uchádzačov o zamestnanie.

Pripomíname vám: pre všetkých čitateľov „Habr“ - zľava 10 000 rubľov pri registrácii do akéhokoľvek kurzu Skillbox pomocou propagačného kódu „Habr“.

Skillbox odporúča: Praktický kurz "Mobile Developer PRO".

Hlavná vec je dôkladne sa pripraviť na pohovor.

Áno, skôr ako sa začneme venovať úlohám, pozrime sa na niekoľko všeobecných tipov na prípravu na pohovor.

Hlavná vec je pripraviť sa vopred. Otestujte si, ako dobre si pamätáte algoritmy a dátové štruktúry, a zlepšite svoje znalosti v oblastiach, ktoré nie ste príliš oboznámení. Existuje mnoho online platforiem, ktoré vám môžu pomôcť pripraviť sa na pohovory. radíme geeksforgeeks, Pramp, Interviewing.io и CodeSignal.

Stojí za to naučiť sa povedať rozhodnutie nahlas. Je vhodné povedať žiadateľom o tom, čo robíte, a nielen písať na tabuľu (alebo písať kód do počítača, tiež potichu). Týmto spôsobom, ak sa v kóde pomýlite, ale riešenie je vo všeobecnosti správne, môžete zvýšiť svoje šance na úspech.

Musíte pochopiť problém skôr, ako ho začnete riešiť. V niektorých prípadoch môžete pochopiť úlohu povrchne a potom ísť nesprávnou cestou. Možno stojí za to položiť osobe, ktorá vedie pohovor, niekoľko objasňujúcich otázok.

Písanie kódu si musíte nacvičiť ručne, nie na PC. Stáva sa, že počas pohovorov dostane uchádzač fixku a tabuľu, kde nie sú žiadne rady ani automatické formátovanie. Pri hľadaní riešenia sa oplatí zapísať si kód na papier alebo priamo na tabuľu. Ak si všetko necháte v hlave, možno na niečo dôležité zabudnete.

Úlohy šablón v JavaScripte

Niektoré z týchto úloh už pravdepodobne poznáte. Buď ste mali pohovory, kde ste mali niečo podobné riešiť, alebo ste na nich cvičili pri učení JavaScriptu. Teraz je čas ich znova vyriešiť a s podrobným vysvetlením procesu.

Palindróm

Palindróm je slovo, veta alebo postupnosť znakov, ktoré sa čítajú úplne rovnako v obvyklom smere aj v opačnom smere. Napríklad „Anna“ je palindróm, ale „stôl“ a „John“ nie sú.

výroba

Daný reťazec; musíte napísať funkciu, ktorá vám umožní vrátiť true, ak je reťazec palindróm, a false, ak nie. V tomto prípade musíte brať do úvahy medzery a interpunkčné znamienka.

palindróm('pretekárske auto') === pravda
palindróm('tabuľka') === nepravda

Poďme analyzovať úlohu

Hlavnou myšlienkou je obrátiť reťazec. Ak je „reverzný“ reťazec úplne identický s pôvodným, potom sme dostali palindróm a funkcia by mala vrátiť hodnotu true. Ak nie, nepravda.

rozhodnutie

Tu je kód, ktorý rieši palindróm.

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

Prvým krokom je previesť znaky vo vstupnom reťazci na malé písmená. To je záruka, že program bude porovnávať samotné znaky a nie prípad alebo čokoľvek iné.

Druhým krokom je obrátiť čiaru. Nie je to ťažké: musíte ho previesť na pole pomocou metódy .split() (knižnica String). Potom pole obrátime pomocou .reverse() (knižnica polí). Posledným krokom je konverzia reverzného poľa na reťazec pomocou .join() (knižnica polí).

Teraz všetko, čo musíte urobiť, je porovnať „reverzný“ reťazec s pôvodným reťazcom a vrátiť výsledok true alebo false.

FizzBuzz

Jedna z najobľúbenejších úloh na pohovoroch.

výroba

Musíte napísať funkciu, ktorá vypíše do konzoly čísla od 1 do n, kde n je celé číslo, ktoré funkcia berie ako parameter, s nasledujúcimi podmienkami:

  • výstup fizz namiesto násobkov 3;
  • výstup bzučiaka namiesto čísel, ktoré sú násobkami 5;
  • výstup fizzbuzz namiesto čísel, ktoré sú násobkami 3 aj 5.

Príklad

Fizzbuzz(5)

Výsledok

// 1 XNUMX
// 2 XNUMX
// šumieť
// 4 XNUMX
//buzz

Poďme analyzovať úlohu

Hlavná vec je tu spôsob, ako nájsť násobky pomocou JavaScriptu. Môže sa implementovať pomocou operátora modulu alebo zvyšku - %, čo umožňuje zobraziť zvyšok pri delení dvoch čísel. Ak je zvyšok 0, znamená to, že prvé číslo je násobkom druhého.

12% 5 // 2 -> 12 nie je násobkom 5
12 % 3 // 0 -> 12 je násobok 3

Ak teda vydelíte 12 5, dostanete 2 so zvyškom 2. Ak vydelíte 12 3, dostanete 4 so zvyškom 0. V prvom prípade 12 nie je násobok 5, v druhom , 12 je násobok 3.

rozhodnutie

Optimálnym riešením by bol nasledujúci kód:

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

Funkcia vykoná potrebné kontroly pomocou podmienených príkazov a vytvorí výsledok požadovaný používateľom. V úlohe stojí za to venovať pozornosť poradiu príkazov if...else: začať dvojitou podmienkou (&&) a skončiť prípadom, keď sa nepodarilo nájsť viacero čísel. V dôsledku toho pokrývame všetky možnosti.

Anagram

Toto je názov slova, ktoré obsahuje všetky písmená iného slova v rovnakom čísle, ale v inom poradí.

výroba

Musíme napísať funkciu, ktorá skontroluje, či dva reťazce sú anagramy, a nezáleží na veľkosti písmen. Počítajú sa iba znaky; medzery alebo interpunkčné znamienka sa neberú do úvahy.

anagram('finder', 'Friend') —> pravda
anagram('ahoj', 'bye') —> nepravda

Poďme analyzovať úlohu

Tu je dôležité zvážiť, že musíte skontrolovať každé písmeno v dvoch vstupných riadkoch a ich počet v každom riadku.

nálezca —> f: 1 priateľ —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Ak chcete uložiť údaje anagramu, mali by ste zvoliť štruktúru, ako je napríklad objektový literál JavaScript. Kľúčový je v tomto prípade charakter písmena, hodnota je počet jeho opakovaní v aktuálnom riadku.

Existujú ďalšie podmienky:

  • Musíte sa uistiť, že pri porovnávaní sa neberie do úvahy veľkosť písmen. Jednoducho prevedieme oba reťazce na malé alebo veľké písmená.
  • Z porovnania vylučujeme všetky neznakové znaky. Najlepšie pracovať regulárne výrazy.

rozhodnutie

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

Dávajte pozor na používanie Object.keys() v úryvku vyššie. Táto metóda vráti pole obsahujúce názvy alebo kľúče v rovnakom poradí, v akom sa nachádzajú v objekte. V tomto prípade bude pole vyzerať takto:

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

Takto získame vlastnosti objektu bez toho, aby sme museli robiť hromadnú slučku. V prípade problému môžete použiť túto metódu s vlastnosťou .length na kontrolu, či oba reťazce majú rovnaký počet znakov – to je dôležitá vlastnosť anagramov.

Hľadajte samohlásky

Pomerne jednoduchá úloha, ktorá sa často objavuje na pohovoroch.

výroba

Musíte napísať funkciu, ktorá berie reťazec ako argument a vracia počet samohlások, ktoré sú v reťazci obsiahnuté.
Samohlásky sú „a“, „e“, „i“, „o“, „u“.

Príklad:

findVowels('ahoj') // —> 2
findVowels('why') // —> 0

rozhodnutie

Tu je najjednoduchšia možnosť:

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
}

Je dôležité venovať pozornosť použitiu metódy .includes(). Je k dispozícii pre reťazce aj polia. Mal by sa použiť na určenie, či pole obsahuje určitú hodnotu. Táto metóda vráti hodnotu true, ak pole obsahuje zadanú hodnotu, a hodnotu false, ak ju neobsahuje.

Existuje kratšie riešenie problému:

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

Využíva metódu .match(), ktorá vám umožňuje implementovať efektívne vyhľadávanie. Ak sa v zadanom reťazci nájde regulárny výraz ako argument metódy, návratová hodnota je pole zodpovedajúcich znakov. No, ak neexistujú žiadne zhody, potom .match() vráti hodnotu null.

Fibonacci

Klasická úloha, ktorú možno nájsť na pohovoroch na rôznych úrovniach. Stojí za to pripomenúť, že Fibonacciho postupnosť je séria čísel, kde každé nasledujúce je súčtom predchádzajúcich dvoch. Takže prvých desať čísel vyzerá takto: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

výroba

Musíte napísať funkciu, ktorá vráti n-tý záznam v určitom poradí, pričom n je číslo, ktoré sa odovzdá funkcii ako argument.

Fibonacci(3) // —> 2

Táto úloha zahŕňa prechádzanie slučkou toľkokrát, koľkokrát je zadané v argumente, a vrátenie hodnoty na príslušnú pozíciu. Tento spôsob riešenia problému vyžaduje použitie slučiek. Ak namiesto toho použijete rekurziu, môže to anketára potešiť a dá vám pár bodov navyše.

rozhodnutie

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 poli výsledkov sú prvé dve čísla obsiahnuté v rade, pretože každý záznam v sekvencii je súčtom predchádzajúcich dvoch čísel. Na úplnom začiatku neexistujú dve čísla, ktoré by sa dali použiť na získanie ďalšieho čísla, takže slučka ich nemôže vygenerovať automaticky. Ale ako vieme, prvé dve čísla sú vždy 0 a 1. Preto môžete pole výsledkov inicializovať manuálne.

Čo sa týka rekurzie, všetko je jednoduchšie a komplikovanejšie zároveň:

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

Stále voláme fibonacci() a odovzdávame stále menšie čísla ako argumenty. Zastavíme sa, keď je odovzdaný argument 0 alebo 1.

Výkon

S najväčšou pravdepodobnosťou ste sa už stretli s niektorou z týchto úloh, ak ste boli na pohovore na prácu frontend alebo JavaScript vývojára (najmä ak ide o juniorskú úroveň). Ale ak ste sa s nimi nestretli, môžu byť užitočné v budúcnosti - aspoň pre všeobecný vývoj.

Skillbox odporúča:

Zdroj: hab.com

Pridať komentár