
Od prekladateľa: publikovali sme pre vás článok , najčastejšie ponúkaných uchádzačom o zamestnanie na pohovoroch. Článok bude užitočný predovšetkým pre začínajúcich programátorov.
Pohovory v technologických spoločnostiach sa už dávno stali známym fenoménom. Nie je sa čomu diviť — úspešné zvládnutie pohovoru dáva možnosť získať dobrú prácu. Ale nie je to také jednoduché, pretože často treba riešiť zložité úlohy.
Navyše, väčšina z týchto úloh často nesúvisí s prácou, ktorú bude uchádzač vykonávať, ale aj tak je potrebné ich vyriešiť. Niekedy je nutné to robiť na tabuli, bez možnosti overiť si to na Google alebo inom zdroji. Áno, situácia sa postupne mení a niektoré firmy sa od takýchto pohovorov vzdávajú, ale mnoho zamestnávateľov stále dodržiava túto tradíciu. Tento článok je venovaný analýze typických úloh v JavaScripte, ktoré sa často používajú ako úlohy pre uchádzačov.
Pripomíname: pre všetkých čitateľov „Habr“ — zľava 10 000 rubľov pri zapísaní na akýkoľvek kurz Skillbox s promo kódom „Habr“.
Skillbox odporúča: Praktický kurz .
Hlavné — dôkladná príprava na váš pohovor
Áno, predtým ako začneme rozoberať úlohy, pozrime sa na všeobecné rady na prípravu na pohovor.
Hlavné — pripravovať sa dopredu. Skontrolujte, ako dobre si pamätáte algoritmy a dátové štruktúry, a posilnite svoje znalosti v oblastiach, ktoré vám nie sú veľmi známe. Existuje mnoho online platforiem, ktoré vám pomôžu pripraviť sa na pohovory. Odporúčame , , a .
Je potrebné naučiť sa priebežne vyslovovať riešenia nahlas. Odporúča sa uchádzačom rozprávať o tom, čo robíte, a nie len písať na tabuli (alebo písať kód na počítači, tiež mlčky). Takto, ak urobíte chybu v kóde, ale cesta riešenia bude v podstate správna, môžete zvýšiť svoje šance na úspech.
Úlohu treba najprv porozumieť, predtým ako začnete s riešením. V niektorých prípadoch je možné povrchné pochopenie úlohy a potom sa vydať zlým smerom. Možno stojí za to položiť niekoľko upresňujúcich otázok hodnotiteľovi.
Je potrebné si nacvičiť písanie kódu ručne, a nie na počítači. Na pohovoroch môže uchádzačovi dať fixku a tabuľu, na ktorej nie sú žiadne nápovedy ani automatické formátovanie. Pri hľadaní riešenia je dobré zapísať si svoj kód na kus papiera alebo priamo na tabuľu. Ak sa všetko drží v hlave, môže sa zabudnúť na niečo dôležité.
Šablónové úlohy na JavaScripte
Možno sú niektoré z týchto úloh pre vás už známe. Buď ste absolvovali pohovory, kde sa muselo riešiť niečo podobné, alebo ste si na nich cvičili počas štúdia JavaScriptu. A teraz je čas ich vyriešiť znova, pričom podrobne vysvetlíme celý proces.
Palindróm
Palindróm je slovo, veta alebo sekvencia znakov, ktorá sa číta rovnako v oboch smeroch. Napríklad, "Anna" je palindróm, zatiaľ čo "table" a "John" nie sú.
Zadanie
Je daný reťazec; treba napísať funkciu, ktorá vráti hodnotu true, ak je reťazec palindróm, a false, ak nie. Pri tom je potrebné zohľadniť medzery a interpunkčné znamienka.
palindrome(‘racecar’) === true
palindrome(‘table’) === false
Analyzujem úlohu
Hlavná myšlienka je otočiť reťazec v opačnom smere. Ak je "otočený" reťazec úplne identický s pôvodným, znamená to, že sme získali palindróm a funkcia by mala vrátiť hodnotu true. Ak to tak nie je — false.
Riešenie
Tu je kód, ktorý umožňuje vyriešiť palindróm.
const palindrome = str => {
// zmeniť reťazec na malé písmená
str = str.toLowerCase()
// otočiť vstupný reťazec a vrátiť výsledok porovnania
return str === str.split('').reverse().join('')
}Prvý krok — prevod znakov vstupného reťazca na malé písmená. To zaručuje, že program porovná presne znaky, nie veľké písmená alebo niečo iné.
Druhý krok — otočiť reťazec. To nie je zložité: je potrebné ho previesť na pole pomocou metódy .split() (knižnica String). Potom otočíme pole pomocou .reverse() (knižnica Array). Posledným krokom je prevod otočeného poľa na reťazec pomocou .join() (knižnica Array).
Teraz stačí porovnať "otočený" reťazec s pôvodným a vrátiť výsledok true alebo false.
FizzBuzz
Jedna z najpopulárnejších úloh na pohovoroch.
Zadanie
Je potrebné napísať funkciu, ktorá vypíše do konzoly čísla od 1 do n, kde n je celé číslo, ktoré funkcia prijíma ako parameter, s takýmito podmienkami:
- vypísať fizz namiesto čísel, ktoré sú deliteľné 3;
- výstup buzz 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
// 2
// fizz
// 4
// buzz
Analyzujem úlohu
Hlavné je metóda hľadania násobkov čísiel pomocou JavaScriptu. Môže sa realizovať pomocou operátora zvyšku alebo modulu — %, ktorý ukazuje 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ásobkom 3
Takže, keď delíme 12 číslom 5, dostaneme 2 s остатком 2. Keď delíme 12 číslom 3, dostaneme 4 s остатком 0. V prvom prípade 12 nie je násobkom 5, v druhom prípade — 12 je násobkom 3.
Riešenie
Optimálne riešenie bude nasledovný 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áva potrebné kontroly pomocou podmienkových operátorov a poskytuje výsledok potrebný používateľovi. V úlohe je dôležité venovať pozornosť poradiu operátorov if…else: začínať s dvojitou podmienkou (&&) a končiť prípadom, keď sa nám nepodarilo nájsť žiadne násobky. Týmto pokrývame všetky možnosti.
Anagram
Takto sa nazýva slovo, ktoré obsahuje všetky písmená iného slova v rovnakom počte, ale v inom poradí.
Zadanie
Je potrebné napísať funkciu, ktorá kontroluje, či sú dve reťazce anagramy, pričom sa nezohľadňuje veľkosť písmen. Zohľadňujú sa iba znaky; medzery alebo interpunkčné znamienka sa do úvahy neberú.
anagram('finder', 'Friend') -> true
anagram('hello', 'bye') -> false
Analyzujem úlohu
Je dôležité brať do úvahy, že je potrebné kontrolovať každé písmeno v oboch vstupných reťazcoch a ich počet v každom reťazci.
finder -> f: 1 friend -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1
Na uchovávanie údajov o anagramoch je vhodné zvoliť štruktúru ako je objektový literál JavaScript. Kľúčom v tomto prípade je znak písmena, hodnota je počet jeho opakovaní v aktuálnom reťazci.
Existujú aj ďalšie podmienky:
- Je potrebné sa uistiť, že veľkosť písmen pri porovnávaní nie je zohľadnená. Jednoducho prevodíme oba reťazce na malé alebo veľké písmená.
- Vylučujeme z porovnávania všetky ne-znaky. Najlepšie je pracovať s .
Riešenie
// 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
}Venovať pozornosť používaniu v hornej časti. Táto metóda vracia pole obsahujúce mená alebo kľúče v rovnakom poradí, v akom sa nachádzajú v objekte. V tomto prípade bude pole takéto:
[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]
Týmto spôsobom získavame vlastnosti objektu bez potreby vykonávať objemnú slučku. V úlohe môžeme tento spôsob použiť so vlastnosťou .length — na kontrolu, či majú oba reťazce rovnaký počet znakov — to je dôležitá vlastnosť anagramov.
Hľadanie samohlások
Celkom jednoduchá úloha, ktorá sa často objavuje na pohovoroch.
Zadanie
Je potrebné napísať funkciu, ktorá prijme reťazec ako argument a vráti počet samohlások, ktoré sa nachádzajú v reťazci.
Samohlásky sú ‘a’, ‘e’, ‘i’, ‘o’, ‘u’.
Príklad:
findVowels(‘hello’) // —> 2
findVowels(‘why’) // —> 0
Riešenie
Tu je najjednoduchšia verzia:
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 ako pre reťazce, tak aj pre polia. Je dobré ju použiť na zistenie, či pole obsahuje určitú hodnotu. Táto metóda vracia true, ak pole obsahuje zadanú hodnotu, a false, ak nie.
Existuje aj kratšie riešenie problému:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matched.length : 0
}Tu sa používa metóda .match(), ktorá umožňuje efektívne hľadanie. Ak je pravidelný výraz ako argument metódy nájdený v zadanom reťazci, vracajúcou hodnotou je pole zhodných znakov. Ak však zhodnotenia nie sú, .match() vracia null.
Fibonacciho
Klasická úloha, ktorú možno nájsť na pohovoroch rôznych úrovní. Je potrebné si pripomenúť, že Fibonacciho postupnosť je séria čísel, kde každé nasledujúce je súčtom dvoch predchádzajúcich. Tak prvých desať čísel vyzerá nasledovne: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Zadanie
Je potrebné napísať funkciu, ktorá vracia n-tú položku v určitej postupnosti, pričom n je číslo, ktoré sa odovzdáva ako argument funkcie.
fibonacci(3) // —> 2
Táto úloha zahŕňa prechádzanie cyklom toľkokrát, koľkokrát je uvedené v argumente, s vrátením hodnoty na príslušnej pozícii. Tento spôsob formulovania úlohy vyžaduje použitie cyklov. Ak namiesto toho použijete rekurziu, môže sa to páčiť vášmu hodnotiteľovi a pridať vám niekoľko ďalších bodov.
Riešenie
const fibonacci = num => {
// uložte Fibonacciho sekvenciu, ktorú budete
// generovať do poľa a
// inicializujte pole s prvými dvoma
// číslami sekvencie
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// pridajte súčet dvoch čísel
// predchádzajúcich pozícii i v poli result
// na konci poľa result
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// vráťte poslednú hodnotu v poli result
return result[num]
}V poli výsledkov sú prvé dve čísla obsiahnuté v rade, pretože každé číslo v sekvencii je súčtom dvoch predchádzajúcich čísel. Na začiatku nie sú dve čísla, ktoré by sa mohli použiť na získanie nasledujúceho čísla, takže cyklus ich nemôže automaticky vygenerovať. Ale, ako vieme, prvé dve čísla sú vždy 0 a 1. Preto môžeme pole výsledkov inicializovať ručne.
Pokiaľ ide o rekurziu, tu je to jednoduchšie a zložitejšie zároveň:
const fibonacci = num => {
// ak je num buď 0 alebo 1, vráťte num
if(num < 2) {
return num
}
// tu je rekurzia
return fibonacci(num - 1) + fibonacci(num - 2)
}Pokračujeme vo volaní fibonacci(), pričom odovzdávame čoraz menšie čísla ako argumenty. Zastavíme sa, ak je odovzdaný argument 0 alebo 1.
Záver
Pravdepodobne ste sa už stretli s niektorou z uvedených úloh, ak ste absolvovali pohovory na pracovné pozície frontend- alebo JavaScript vývojára (najmä na úrovni junior). Ale aj ak ste sa s nimi nestretli, môžu sa vám hodiť do budúcnosti — minimálne na všeobecný rozvoj.
Skillbox odporúča:
- Aplikovaný online kurz .
- Online kurz .
- Praktický ročný kurz .
Zdroj: habr.com
