5 Běžné problémy s JavaScriptovým rozhovorem: Analýza a řešení

5 Běžné problémy s JavaScriptovým rozhovorem: Analýza a řešení

Od překladatele: publikoval pro vás článek Maria Antonietta Perna, která hovoří o typických úlohách JavaScriptu, nejčastěji nabízené uchazečům-vývojářům na pohovorech. Článek bude užitečný především pro začínající programátory.

O pohovorech v technologických firmách se ve městě dlouho mluví. To není překvapivé - úspěšné dokončení pohovoru umožňuje získat dobrou práci. To ale není tak jednoduché, protože často je potřeba řešit složité problémy.

Navíc většinou většina těchto úkolů nesouvisí s prací, kterou bude žadatel vykonávat, ale přesto je potřeba je vyřešit. Někdy to musíte udělat přímo na desce, aniž byste to kontrolovali u Googlu nebo jiného zdroje. Ano, situace se postupně mění a v některých firmách takové pohovory odmítají, ale řada zaměstnavatelů se této tradice stále drží. Tento článek je věnován analýze typických úloh JavaScriptu, které se často používají jako úlohy pro žadatele.

Připomínáme: pro všechny čtenáře "Habr" - sleva 10 000 rublů při zápisu do jakéhokoli kurzu Skillbox pomocí propagačního kódu "Habr".

Skillbox doporučuje: Praktický kurz "Mobile Developer PRO".

Hlavní věcí je pečlivě se připravit na pohovor.

Ano, než se pustíme do rozpisování úkolů, podívejme se na pár obecných tipů pro přípravu na pohovor.

Hlavní věc je připravit se předem. Zkontrolujte, jak dobře si pamatujete algoritmy a datové struktury, a zdokonalte své znalosti v oblastech, které příliš neznáte. Existuje mnoho online platforem, které vám pomohou připravit se na pohovor. Radíme geeksforgeeks, Pramp, Interviewing.io и CodeSignal.

Stojí za to naučit se vyslovovat rozhodnutí nahlas. Je vhodné žadatelům sdělit, co děláte, a ne jen psát na tabuli (nebo psát kód na počítači, také potichu). Pokud tedy uděláte chybu v kódu, ale řešení je obecně správné, můžete zvýšit své šance na úspěch.

Před zahájením řešení je třeba problém pochopit. V některých případech můžete úkolu povrchně porozumět a pak jít špatnou cestou. Možná by stálo za to položit tazateli několik objasňujících otázek.

Psaní kódu je potřeba cvičit ručně, ne na PC. Stává se, že na pohovorech uchazeč dostane fix a tabuli, kde nejsou žádné výzvy ani automatické formátování. Při hledání řešení si zapište svůj kód na papír nebo přímo na tabuli. Pokud budete mít vše v hlavě, můžete na něco důležitého zapomenout.

Šablony úkolů v JavaScriptu

Některé z těchto úkolů pravděpodobně již znáte. Buď jste absolvovali pohovory, kde jste měli něco podobného řešit, nebo na nich cvičili při učení JavaScriptu. No a teď je čas je vyřešit znovu a s podrobným vysvětlením postupu.

Palindrom

Palindrom je slovo, věta nebo posloupnost znaků, která se čte přesně stejným způsobem jak v obvyklém směru, tak i v opačném směru. Například „Anna“ je palindrom, ale „stůl“ a „John“ nikoli.

Staging

Daný řetězec; musíte napsat funkci, která vám umožní vrátit hodnotu true, pokud je řetězec palindrom, a jinak hodnotu false. V tomto případě je třeba vzít v úvahu mezery a interpunkční znaménka.

palindrom('závodní auto') === pravda
palindrom('tabulka') === false

Analýza úkolu

Hlavní myšlenkou je zde převrátit provázek dozadu. Pokud je „reverzní“ řetězec zcela identický s původním, pak jsme dostali palindrom a funkce by měla vrátit true. Pokud ne, nepravda.

rozhodnutí

Zde je kód, který vám umožní vyřešit 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('')
}

Prvním krokem je převod znaků vstupního řetězce na malá písmena. To je záruka, že program bude porovnávat přesně samotné znaky a ne případ nebo něco jiného.

Druhým krokem je obrácená linie. To je snadné: musíte jej převést na pole pomocí metody .split() (knihovna String). Potom pole obrátíme pomocí .reverse() (knihovna pole). Posledním krokem je převod reverzního pole na řetězec pomocí .join() (knihovna pole).

Nyní vše, co je potřeba, je porovnat „reverzní“ řetězec s původním a vrátí výsledek true nebo false.

fizzbuzz

Jeden z nejoblíbenějších pracovních pohovorů.

Staging

Je nutné napsat funkci, která zobrazuje čísla od 1 do n do konzole, kde n je celé číslo, které funkce bere jako parametr, s následujícími podmínkami:

  • výstupní šum místo násobků 3;
  • bzučivý výstup místo násobků 5;
  • výstup fizzbuzz místo násobků 3 a 5.

příklad

Fizzbuzz (5)

Výsledek

/ / 1
/ / 2
// šumí
/ / 4
//bzučet

Analýza úkolu

Hlavní věc je zde způsob, jak najít násobky pomocí JavaScriptu. Lze jej implementovat pomocí operátoru modulu nebo zbytku -%, který umožňuje zobrazit zbytek při dělení dvou čísel. Pokud je zbytek 0, znamená to, že první číslo je násobkem druhého.

12% 5 // 2 -> 12 není násobek 5
12 % 3 // 0 -> 12 je násobek 3

Pokud tedy vydělíme 12 5, dostaneme 2 se zbytkem 2. Pokud vydělíme 12 3, dostaneme 4 se zbytkem 0. V prvním případě 12 není násobkem 5, v za druhé, 12 je násobek 3.

rozhodnutí

Nejlepším řešením by byl následující 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)
    }
  }
}

Funkce provádí potřebné kontroly pomocí podmíněných příkazů a vytváří výsledek požadovaný uživatelem. V úloze je vhodné věnovat pozornost pořadí příkazů if...else: počínaje dvojitou podmínkou (&&) a konče případem, kdy nebylo možné najít více čísel. V důsledku toho pokrýváme všechny možnosti.

Anagram

Jedná se o název slova, které obsahuje všechna písmena jiného slova ve stejném čísle, ale v jiném pořadí.

Staging

Potřebujeme napsat funkci, která zkontroluje, zda jsou dva řetězce anagramy, a na velikosti písmen nezáleží. Počítají se pouze znaky; mezery nebo interpunkční znaménka se neberou v úvahu.

anagram('finder', 'Friend') --> true
anagram('ahoj', 'sbohem') --> false

Analýza úkolu

Zde je důležité zvážit, že je nutné zkontrolovat každé písmeno ve dvou vstupních řádcích a jejich počet v každém řádku.

nálezce -> f: 1 přítel -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Pro ukládání dat přesmyček byste měli zvolit strukturu, jako je literál objektu JavaScript. Klíčem je v tomto případě charakter písmene, hodnota je počet jeho opakování v aktuálním řádku.

Jsou zde i další podmínky:

  • Musíte se ujistit, že se při porovnávání nebere v úvahu velikost písmen. Stačí převést oba řetězce na malá nebo velká písmena.
  • Z porovnání vylučujeme všechny neznakové znaky. Nejlépe pracovat regulární výrazy.

rozhodnutí

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

Věnujte pozornost použití Object.keys() ve výše uvedeném úryvku. Tato metoda vrací pole obsahující názvy nebo klíče ve stejném pořadí, v jakém se objevují v objektu. V tomto případě bude pole vypadat takto:

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

Tímto způsobem získáme vlastnosti objektu, aniž bychom museli dělat velkou smyčku. V úloze můžete tuto metodu použít s vlastností .length - pro kontrolu, zda mají oba řetězce stejný počet znaků - to je důležitá vlastnost anagramů.

Hledání samohlásek

Poměrně jednoduchý úkol, který se často vyskytuje při pohovorech.

Staging

Musíte napsat funkci, která vezme řetězec jako argument a vrátí počet samohlásek, které řetězec obsahuje.
Samohlásky jsou "a", "e", "i", "o", "u".

Příklad:

findVowels('hello') // --> 2
findVowels('proč') // --> 0

rozhodnutí

Zde je nejjednodušší možnost:

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é věnovat pozornost použití metody .includes(). Je k dispozici pro řetězce i pole. Mělo by se použít ke zjištění, zda pole obsahuje určitou hodnotu. Tato metoda vrací hodnotu true, pokud pole obsahuje zadanou hodnotu, a v opačném případě vrací hodnotu false.

Existuje také kratší řešení problému:

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

Je zde použita metoda .match(), která umožňuje implementovat efektivní vyhledávání. Pokud je v zadaném řetězci nalezen regulární výraz jako argument metody, je návratovou hodnotou pole odpovídajících znaků. No, pokud nejsou žádné shody, pak .match() vrátí hodnotu null.

Fibonacci

Klasický úkol, který lze splnit na pohovorech různé úrovně. Stojí za to připomenout, že Fibonacciho posloupnost je řada čísel, kde každé následující je součtem předchozích dvou. Takže prvních deset čísel vypadá takto: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Staging

Potřebujete napsat funkci, která vrátí n-tý záznam v určité sekvenci a n je číslo, které je předáno funkci jako argument.

fibonacci(3) // --> 2

Tato úloha zahrnuje opakování počtu opakování zadaného v argumentu a vrácení hodnoty na příslušné pozici. Tento způsob nastavení problému vyžaduje použití smyček. Pokud místo toho použijete rekurzi, může se to tazateli líbit a dá vám pár bodů navíc.

rozhodnutí

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ýsledků jsou první dvě čísla obsažena v řadě, protože každý záznam v posloupnosti se skládá ze součtu předchozích dvou čísel. Na samém začátku nejsou žádná dvě čísla, která lze použít k získání dalšího čísla, takže je smyčka nemůže generovat automaticky. Ale jak víme, první dvě čísla jsou vždy 0 a 1. Proto můžete pole výsledků inicializovat ručně.

Co se týče rekurze, vše je jednodušší a složitější 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 předáváme menší a menší čísla jako argumenty. Zastavíme se, když je předaný argument 0 nebo 1.

Výkon

S největší pravděpodobností jste již čelili některému z těchto úkolů, pokud jste vedli pohovor na práci frontendu nebo vývojáře JavaScriptu (zejména pokud se jedná o nižší úroveň). Ale pokud jste na ně nenarazili, mohou se vám v budoucnu hodit – alespoň pro obecný vývoj.

Skillbox doporučuje:

Zdroj: www.habr.com

Přidat komentář