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