
От преводача: публикувахме статия за вас , най-често предлагани на кандидати-програмисти по време на интервюта. Статията ще бъде полезна, преди всичко, на начинаещите програмисти.
Интервютата в технологичните компании отдавна са притча во языцех. Не е чудно — успешното преминаване на интервюто дава възможност за получаване на добра работа. Но това не е толкова просто, тъй като често е необходимо да се решават сложни задачи.
Освен това, най-често повечето от тези задачи нямат отношение към работата, която кандидатът ще изпълнява, но те все пак трябва да бъдат решени. Понякога се налага да се прави това на дъска, без контрол с Google или друго източник. Да, ситуацията постепенно се променя и в някои компании се отказват от такива интервюта, но много работодатели все още следват тази традиция. Тази статия е посветена на разглеждането на типични JavaScript задачи, които често се използват като задачи за кандидати.
Напомняме: за всички читатели на «Хабра» — отстъпка от 10 000 рубли при записване на всеки курс Skillbox с промокод «Хабр».
Skillbox препоръчва: Практически курс .
Най-важното е внимателната подготовка за вашето интервю
Да, преди да започнем с разглеждането на задачите, нека разгледаме общи съвети за подготовка за интервю.
Най-важното е да се подготвите предварително. Проверете колко добре помните алгоритмите и структурите от данни и затегнете знанията си в областите, които не са ви особено известни. Има много онлайн платформи, които ще помогнат в подготовката за преминаването на интервюта. Препоръчваме , , и .
Струва си да се научите да проговаряте решението на глас. Желателно е да разказвате на интервюиращия какво правите, а не просто да пишете на дъската (или пък да набирате код на компютъра, също мълчаливо). По този начин, ако в кода допуснете грешка, но ходът на решението е общо правилен, можете да увеличите шансовете си за успех.
Задачата трябва да бъде осмислена, преди да започнете решението. В някои случаи може да разберете повърхностно задачата и след това да поемете по неверния път. Може би е добре да зададете няколко уточняващи въпроса на интервюиращия.
Трябва да се упражнявате да пишете код на ръка, а не на компютър. Случва се по време на интервюта да дават на кандидата маркер и дъска без никакви подсказки или автоматично форматиране. При търсене на решение е добре да запишете кода си на лист хартия или направо на дъската. Ако държите всичко в главата си, може да забравите нещо важно.
Шаблонни задачи на JavaScript
Вероятно някои от тези задачи вече са ви познати. Либо сте преминавали интервюта, в които е трябвало да решавате нещо подобно, или сте практикували по време на изучаването на JavaScript. А сега е време да ги решите отново, като обясните подробно процеса.
Палиндром
Палиндром е дума, изречение или последователност от символи, която се чете абсолютно еднакво в двете посоки. Например, „Anna“ е палиндром, а „table“ и „John“ не са.
Задача
Дадена е строка; необходимо е да напишете функция, която връща true, ако строката е палиндром, и false, ако не е. При това трябва да се вземат предвид интервалите и знаците за препинание.
palindrome(‘racecar’) === true
palindrome(‘table’) === false
Разбор на задачата
Основната идея тук е да обърнем строката в обратна посока. Ако „обърнатата“ строка е напълно идентична на оригиналната, значи получаваме палиндром и функцията трябва да върне true. Ако не — false.
Решение
Ето кода, който позволява да се реши задачата за палиндром.
const palindrome = str => {
// преобразуване на строката в малки букви
str = str.toLowerCase()
// обръщане на входната строка и връщане на резултата от
// сравнението
return str === str.split('').reverse().join('')
}Първата стъпка е преобразуването на символите на входната строка в малки букви. Това гарантира, че програмата ще сравнява именно самите символи, а не регистъра или нещо друго.
Втората стъпка е обръщането на строката. Това не е сложно: необходимо е да я преобразувате в масив с помощта на метода .split() (библиотеката String). След това обръщаме масива, usando .reverse() (библиотеката Array). Последната стъпка е преобразуването на обърнатия масив в строка с помощта на .join() (библиотеката Array).
Сега всичко, което трябва да направите, е да сравните „обърнатата“ строка с оригиналната и да върнете резултат true или false.
FizzBuzz
Една от най-популярните задачи на интервюта.
Задача
Необходимо е да напишете функция, която извежда в конзолата числата от 1 до n, където n е цяло число, което функцията приема като параметър, с условията:
- да се извежда fizz вместо числа, кратни на 3;
- изход buzz вместо числа, кратни на 5;
- изход fizzbuzz вместо числа, кратни както на 3, така и на 5.
Пример
Fizzbuzz(5)
Резултат
// 1
// 2
// fizz
// 4
// buzz
Разбор на задачата
Основното тук е начинът на намиране на кратни числа с помощта на JavaScript. Може да се реализира с оператора за остатък или модула — %, който показва остатъка при деление на две числа. Ако остатъкът е 0, това означава, че първото число е кратно на второто.
12 % 5 // 2 -> 12 не е кратно на 5
12 % 3 // 0 -> 12 е кратно на 3
Така, ако разделим 12 на 5, получаваме 2 с остатък 2. Но ако разделим 12 на 3, получаваме 4 с остатък 0. В първия случай 12 не е кратно на 5, а във втория — 12 е кратно на 3.
Решение
Оптималното решение ще бъде следният код:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// проверка дали числото е кратно на 3 и 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // проверка дали числото е кратно на 3
else if(i % 3 === 0) {
console.log('fizz')
} // проверка дали числото е кратно на 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}Функцията извършва необходимите проверки с помощта на условни оператори и предоставя резултата, необходим на потребителя. В задачата е важно да се обърне внимание на реда на операторите if…else: започва се с двойното условие (&&) и се завършва с случая, когато не се намират кратни числа. В резултат обхващаме всички варианти.
Анаграмa
Това е дума, която съдържа всички букви на друга дума в същото количество, но в различен ред.
Задача
Трябва да напишете функция, която проверява дали двете строки са анаграми, като регистърът на буквите няма значение. Важно е само символите; интервалите или пунктуационните знаци не се вземат предвид.
anagram(‘finder’, ‘Friend’) -> true
anagram(‘hello’, ‘bye’) -> false
Разбор на задачата
Важно е да се уверим, че проверяваме всяка буква в двете входни стрings и тяхното количество в всяка строка.
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
За съхранение на данните от анаграмата е добре да се избере структура като обекти в JavaScript. Ключът в този случай е символът на буквата, а стойността е количеството на повторенията в текущата строка.
Има и други условия:
- Трябва да се уверим, че регистърът на буквите не се взима предвид при сравнението. Просто преобразуваме двете строки в малки или големи букви.
- Изключваме от сравнението всички не-символи. Най-добре е да работим с .
Решение
// 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
}Обърнете внимание на използването на в горе посоченото. Този метод връща масив, съдържащ имена или ключове в същия ред, по който се срещат в обекта. В такъв случай масивът ще изглежда така:
[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]
Така получаваме свойствата на обекта без необходимост от обемен цикъл. В задачата може да се използва този метод със свойството .length — за проверка дали в двете низове има равно количество символи — това е важна особеност на анаграмите.
Търсене на гласни
Достатъчно проста задача, която често се среща на интервюта.
Задача
Трябва да напишете функция, която приема низ като аргумент и връща броя на гласните, които се съдържат в низа.
Гласните са «a», «e», «i», «o», «u».
Пример:
findVowels(‘hello’) // —> 2
findVowels(‘why’) // —> 0
Решение
Тук е най-простият вариант:
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
}Важно е да обърнете внимание на използването на метода .includes(). Той е наличен и за низове, и за масиви. Струва си да се прилага, за да се установи дали масивът съдържа определена стойност. Този метод връща true, ако масивът съдържа посочената стойност, и false, ако не.
Има и по-кратко решение на проблема:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matched.length : 0
}Тук се използва методът .match(), който позволява реализирането на ефективно търсене. Ако регулярното изражение като аргумент на метода бъде намерено в посочения низ, връщаното значение става масив на съответстващите символи. А ако няма съвпадения, .match() връща null.
Фибоначчи
Класическа задача, която може да се срещне на интервюта на различни нива. Струва си да се припомни, че последователността на Фибоначчи е редица числа, където всяко следващо е сумата на двете предишни. Така че, първите десет числа изглеждат по следния начин: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Задача
Трябва да напишете функция, която връща n-то число в определена последователност, където n е число, предадено като аргумент на функцията.
fibonacci(3) // —> 2
Тази задача включва преминаване през цикъл толкова пъти, колкото е посочено в аргумента, с връщане на стойността на съответната позиция. Този начин на задаване на задачата изисква използването на цикли. Ако вместо това използвате рекурсия, това може да се хареса на интервюиращия и да ви даде няколко допълнителни точки.
Решение
const fibonacci = num => {
// съхраняваме последователността на Фибоначи, която ще генерираме
// в масив и
// инициализираме масива с първите две
// числа от последователността
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// добавяме сумата на двете числа
// предшестващи позицията на i в масива result
// в края на масива result
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// връщаме последната стойност в масива result
return result[num]
}В масива с резултати първите две числа се съдържат в реда, тъй като всяка записа в последователността се състои от сумата на двете предишни числа. В самото начало няма две числа, които да вземем, за да получим следващото число, затова цикълът не може да ги генерира автоматично. Но както знаем, първите две числа - винаги са 0 и 1. Следователно, можем ръчно да инициализираме масива с резултати.
Що се отнася до рекурсията, тук е едновременно по-просто и по-сложно:
const fibonacci = num => {
// ако num е или 0 или 1, връщаме num
if(num < 2) {
return num
}
// рекурсия тук
return fibonacci(num - 1) + fibonacci(num - 2)
}Продължаваме да извикваме fibonacci(), предавайки все по-малки числа като аргументи. Спрямо се, когато подаденият аргумент е 0 или 1.
Извод
Вероятно вече сте се срещали с някоя от посочените задачи, ако сте преминали интервюта за работа като frontend- или JavaScript-разработчик (особено ако това е ниво junior). Но ако не сте, те могат да бъдат полезни в бъдеще - поне за общо развитие.
Skillbox препоръчва:
- Прикладен онлайн курс .
- Онлайн курс .
- Практически годишен курс .
Източник: habr.com
