5 често срещани проблема с интервюта с JavaScript: анализ и решения

5 често срещани проблема с интервюта с JavaScript: анализ и решения

От преводача: публикува статия за вас Мария Антониета Перна, която говори за типичните JavaScript задачи, най-често предлагани на кандидат-разработчици на интервюта. Статията ще бъде полезна преди всичко за начинаещи програмисти.

Интервютата в технологични компании отдавна са тема на разговори. Това не е изненадващо - успешното завършване на интервюто прави възможно намирането на добра работа. Но това не е толкова лесно, защото често е необходимо да се решават сложни проблеми.

Освен това най-често повечето от тези задачи не са свързани с работата, която кандидатът ще изпълнява, но все пак трябва да бъдат решени. Понякога трябва да го направите на дъската, без да проверявате с Google или друг източник. Да, ситуацията постепенно се променя и в някои компании те отказват такива интервюта, но много работодатели все още се придържат към тази традиция. Тази статия е посветена на анализа на типични JavaScript задачи, които често се използват като задачи за кандидати.

Напомняме ви: за всички читатели на "Habr" - отстъпка от 10 000 рубли при записване във всеки курс Skillbox, използвайки промоционалния код на "Habr".

Skillbox препоръчва: Практически курс „Мобилен разработчик PRO“.

Основното нещо е внимателно да се подготвите за интервюто.

Да, преди да започнем да разделяме задачите, нека разгледаме някои общи съвети за подготовка за интервю.

Основното е да се подготвите предварително. Проверете колко добре помните алгоритми и структури от данни и подобрете знанията си в области, с които не сте много запознати. Има много онлайн платформи, които да ви помогнат да се подготвите за интервюта. Ние съветваме geeksforgeeks, Количка, Интервюиране.io и CodeSignal.

Струва си да се научите да произнасяте решението на глас. Препоръчително е да кажете на кандидатите какво правите, а не просто да пишете на дъската (или да въвеждате код на компютъра, също тихо). По този начин, ако направите грешка в кода, но решението като цяло е правилно, можете да увеличите шансовете си за успех.

Проблемът трябва да бъде разбран, преди да може да се започне решението. В някои случаи можете повърхностно да разберете задачата и след това да тръгнете по грешния път. Може би си струва да зададете няколко изясняващи въпроса на интервюиращия.

Трябва да се упражнявате да пишете код на ръка, а не на компютър. Случва се на интервюта на кандидата да се даде маркер и дъска, където няма съвети или автоматично форматиране. Когато търсите решение, запишете кода си на лист хартия или направо на дъската. Ако държите всичко в главата си, можете да забравите нещо важно.

Шаблонни задачи в JavaScript

Вероятно вече сте запознати с някои от тези задачи. Или сте взели интервюта, където трябва да решите нещо подобно, или сте се упражнявали върху тях, докато сте учили JavaScript. Е, сега е време да ги решим отново и то с подробно обяснение на процеса.

Палиндром

Палиндромът е дума, изречение или последователност от знаци, които се четат по абсолютно същия начин както в обичайната посока, така и в обратната посока. Например "Анна" е палиндром, но "маса" и "Джон" не са.

производство

Даден низ; трябва да напишете функция, която ви позволява да върнете true, ако низът е палиндром, и false в противен случай. В този случай трябва да се вземат предвид интервалите и препинателните знаци.

palindrome('racecar') === вярно
palindrome('table') === невярно

Разбор на задачата

Основната идея тук е да обърнете връвта назад. Ако "обратният" низ е напълно идентичен с оригиналния, тогава имаме палиндром и функцията трябва да върне true. Ако не, невярно.

Решение

Ето кода, който ви позволява да решите палиндрома.

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

Първата стъпка е да преобразувате символите на въведения низ в малки букви. Това е гаранция, че програмата ще сравнява точно самите знаци, а не малки и големи букви или нещо друго.

Втората стъпка е обратната страна на линията. Това се прави лесно: трябва да го конвертирате в масив, като използвате метода .split() (библиотека String). След това обръщаме масива с помощта на .reverse() (библиотека с масиви). Последната стъпка е да преобразувате обратния масив в низ с помощта на .join() (библиотека с масиви).

Сега всичко, което е необходимо, е да сравните „обратния“ низ с оригиналния, връщайки резултата true или false.

бръмчене

Едно от най-популярните интервюта за работа.

производство

Изисква се да се напише функция, която показва числа от 1 до n на конзолата, където n е цяло число, което функцията приема като параметър, при следните условия:

  • изведе шум вместо кратни на 3;
  • бръмчене вместо кратни на 5;
  • fizzbuzz изход вместо кратни на 3 и 5.

Пример

Fizzbuzz (5)

Резултат

// 1 г.
// 2 г.
// шипене
// 4 г.
// бръмча

Разбор на задачата

Основното тук е начинът за намиране на кратни чрез 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++) {
    // 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)
    }
  }
}

Функцията извършва необходимите проверки с помощта на условни изрази и произвежда резултата, изискван от потребителя. В задачата си струва да обърнете внимание на реда на операторите if...else: започвайки с двойно условие (&&) и завършвайки със случая, когато няколко числа не могат да бъдат намерени. В резултат на това покриваме всички опции.

анаграма

Това е името на дума, която съдържа всички букви на друга дума в същия брой, но в различен ред.

производство

Трябва да напишем функция, която проверява дали два низа са анаграми и регистърът на буквите няма значение. Само знаците се броят; интервали или препинателни знаци не се вземат предвид.

анаграма ('търсач', 'Приятел') --> вярно
анаграма ('здравей', 'чао') --> невярно

Разбор на задачата

Тук е важно да се има предвид, че е необходимо да се провери всяка буква в два входни реда и техния брой във всеки ред.

намиращ -> f: 1 приятел -> 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
}

Обърнете внимание на употребата Object.keys() в горния фрагмент. Този метод връща масив, съдържащ имената или ключовете в същия ред, в който се появяват в обекта. В този случай масивът ще изглежда така:

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

По този начин получаваме свойствата на обекта, без да се налага да правим голям цикъл. В задача можете да използвате този метод със свойството .length - за да проверите дали и двата низа имат еднакъв брой знаци - това е важна характеристика на анаграмите.

Търсене на гласни

Доста проста задача, която често се среща на интервюта.

производство

Трябва да напишете функция, която приема низ като аргумент и връща броя на гласните, които съдържа низът.
Гласните са "a", "e", "i", "o", "u".

Пример:

findVowels('hello') // --> 2
findVowels('защо') // --> 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 ? matches.length : 0
}

Тук се използва методът .match(), който ви позволява да реализирате ефективно търсене. Ако регулярен израз като аргумент на метода е намерен в указания низ, тогава върнатата стойност е масив от съвпадащи знаци. Е, ако няма съвпадения, тогава .match() връща нула.

Фибоначи

Класическа задача, която може да бъде изпълнена на интервюта на различни нива. Струва си да припомним, че последователността на Фибоначи е поредица от числа, където всяко следващо е сумата от предходните две. И така, първите десет числа изглеждат така: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

производство

Трябва да напишете функция, която връща n-тия запис в определена последователност, а n е число, което се предава като аргумент на функцията.

fibonacci(3) // --> 2

Тази задача включва преминаване през броя пъти, посочени в аргумента, връщане на стойността на подходящата позиция. Този начин на задаване на проблема изисква използването на цикли. Ако вместо това използвате рекурсия, интервюиращият може да го хареса и да ви даде няколко допълнителни точки.

Решение

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

В масива с резултати първите две числа се съдържат в един ред, тъй като всеки запис в последователността се състои от сумата на предходните две числа. В самото начало няма две числа, които могат да бъдат взети, за да се получи следващото число, така че цикълът не може да ги генерира автоматично. Но, както знаем, първите две числа винаги са 0 и 1. Следователно можете да инициализирате резултатния масив ръчно.

Що се отнася до рекурсията, всичко е по-просто и по-сложно едновременно:

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

Продължаваме да извикваме fibonacci(), като подаваме все по-малки числа като аргументи. Спираме, когато предаденият аргумент е 0 или 1.

Продукция

Най-вероятно вече сте се сблъсквали с някоя от тези задачи, ако сте били на интервю за работа като frontend или JavaScript разработчик (особено ако е младше ниво). Но ако не сте се натъкнали на тях, те могат да ви бъдат полезни в бъдеще - поне за общо развитие.

Skillbox препоръчва:

Източник: www.habr.com

Добавяне на нов коментар