
Od tłumacza: opublikowaliśmy dla was artykuł , najczęściej zadawanych kandydatom-programistom na rozmowach kwalifikacyjnych. Artykuł będzie przydatny przede wszystkim początkującym programistom.
Rozmowy kwalifikacyjne w firmach technologicznych stały się legendarne. Nie ma się czemu dziwić — udane przejście rozmowy otwiera drzwi do dobrej pracy. Ale to nie jest takie proste, ponieważ często trzeba rozwiązywać skomplikowane zadania.
Co więcej, większość tych zadań nie ma związku z pracą, którą będzie wykonywał kandydat, ale mimo to trzeba je rozwiązać. Czasami trzeba to zrobić na tablicy, bez sprawdzania w Google czy jakimkolwiek innym źródle. Tak, sytuacja stopniowo się zmienia, a w niektórych firmach rezygnuje się z takich rozmów, ale wielu pracodawców nadal trzyma się tej tradycji. Artykuł poświęcony jest analizie typowych zadań z JavaScript, które często są używane jako zadania dla kandydatów.
Przypominamy: dla wszystkich czytelników „Habra” — zniżka 10 000 rubli przy zapisie na dowolny kurs Skillbox z kodem promocyjnym „Habra”.
Skillbox poleca: Praktyczny kurs .
Najważniejsze — dokładne przygotowanie do rozmowy kwalifikacyjnej
Tak, zanim zaczniemy omawiać zadania, spójrzmy na ogólne porady dotyczące przygotowania się do rozmowy.
Najważniejsze — przygotować się z wyprzedzeniem. Sprawdź, jak dobrze pamiętasz algorytmy i struktury danych, i uzupełnij wiedzę w obszarach, które nie są ci dobrze znane. Istnieje wiele platform online, które pomogą w przygotowaniu się do rozmów kwalifikacyjnych. Polecamy , , i .
Warto nauczyć się głośno opowiadać o swoim rozwiązaniu. Zaleca się, aby mówić kandydatom o tym, co robisz, a nie tylko pisać na tablicy (lub pisać kod na komputerze, także w milczeniu). W ten sposób, jeśli w kodzie popełnisz błąd, ale sposób rozwiązania będzie ogólnie poprawny, możesz zwiększyć swoje szanse na sukces.
Zadanie należy przemyśleć, zanim przystąpimy do rozwiązania. W niektórych przypadkach można powierzchownie zrozumieć zadanie i pójść w niewłaściwym kierunku. Może warto zadać kilka dodatkowych pytań interviewera.
Należy poćwiczyć pisanie kodu ręcznie, a nie na komputerze. Czasami na rozmowach kwalifikacyjnych kandydatowi daje się marker i tablicę, na której nie ma żadnych podpowiedzi ani automatycznego formatowania. Podczas szukania rozwiązania warto zapisać swój kod na kartce papieru lub bezpośrednio na tablicy. Jeśli wszystko będzie w pamięci, można zapomnieć o czymś ważnym.
Zadania wzorcowe z JavaScript
Prawdopodobnie niektóre z tych zadań są wam już znane. Albo uczestniczyliście w rozmowach kwalifikacyjnych, gdzie trzeba było rozwiązywać coś podobnego, albo ćwiczyliście je podczas nauki JavaScript. A teraz nadszedł czas, aby rozwiązać je jeszcze raz, z dokładnym wyjaśnieniem procesu.
Palindrom
Palindrom to słowo, zdanie lub sekwencja znaków, która jest czytana identycznie zarówno od przodu, jak i od tyłu. Na przykład, "Anna" to palindrom, a "table" i "John" nie są.
Postawienie zadania
Dana jest strona; musimy napisać funkcję, która zwraca wartość true, jeśli strona jest palindromem, a false, jeśli nie. Należy przy tym uwzględnić spacje i znaki interpunkcyjne.
palindrome(‘racecar’) === true
palindrome(‘table’) === false
Analizujemy zadanie
Główna idea tutaj polega na odwróceniu łańcucha w odwrotnym kierunku. Jeśli "odwrócony" łańcuch jest dokładnie taki sam jak oryginalny, to znaczy, że mamy palindrom i funkcja powinna zwrócić wartość true. W przeciwnym razie — false.
Rozwiązanie
Oto kod, który pozwala rozwiązać problem palindromu.
const palindrome = str => {
// zamień łańcuch na małe litery
str = str.toLowerCase()
// odwróć łańcuch wejściowy i zwróć wynik porównania
return str === str.split('').reverse().join('')
}Pierwszym krokiem jest zamiana znaków łańcucha wejściowego na małe litery. To gwarancja, że program będzie porównywał same znaki, a nie wielkość liter czy coś innego.
Drugim krokiem jest odwrócenie łańcucha. To nie jest trudne: trzeba go przekształcić w tablicę za pomocą metody .split() (biblioteka String). Następnie odwracamy tablicę, używając .reverse() (biblioteka Array). Ostatnim krokiem jest przekształcenie odwróconej tablicy w łańcuch przy pomocy .join() (biblioteka Array).
Teraz wystarczy porównać "odwrócony" łańcuch z oryginalnym, zwracając wynik true lub false.
FizzBuzz
Jedno z najpopularniejszych zadań na rozmowach kwalifikacyjnych.
Postawienie zadania
Należy napisać funkcję, która wypisuje w konsoli liczby od 1 do n, gdzie n to liczba całkowita przekazywana jako parametr funkcji, z następującymi warunkami:
- wypisanie fizz zamiast liczb podzielnych przez 3;
- wyjście buzz zamiast liczb podzielnych przez 5;
- wyjście fizzbuzz zamiast liczb podzielnych zarówno przez 3, jak i 5.
Przykład
Fizzbuzz(5)
Wynik
// 1
// 2
// fizz
// 4
// buzz
Analizujemy zadanie
Głównym celem jest sposób wyszukiwania liczb podzielnych z wykorzystaniem JavaScript. Można to zaimplementować za pomocą operatora reszty z dzielenia — %, który pokazuje resztę z dzielenia dwóch liczb. Jeśli reszta wynosi 0, oznacza to, że pierwsza liczba jest podzielna przez drugą.
12 % 5 // 2 -> 12 nie jest podzielne przez 5
12 % 3 // 0 -> 12 jest podzielne przez 3
Zatem, dzieląc 12 przez 5, otrzymujemy 2 z resztą 2. Dzieląc 12 przez 3, dostajemy 4 z resztą 0. W pierwszym przypadku 12 nie jest podzielne przez 5, w drugim — 12 jest podzielne przez 3.
Rozwiązanie
Optymalnym rozwiązaniem będzie następujący kod:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// sprawdź, czy liczba jest podzielna przez 3 i 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // sprawdź, czy liczba jest podzielna przez 3
else if(i % 3 === 0) {
console.log('fizz')
} // sprawdź, czy liczba jest podzielna przez 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}Funkcja wykonuje wymagane kontrole z wykorzystaniem operatorów warunkowych i zwraca wynik potrzebny użytkownikowi. W zadaniu należy zwrócić uwagę na kolejność operatorów if…else: zaczynać od podwójnego warunku (&&) i kończyć przypadkiem, gdy nie znaleziono liczb podzielnych. W rezultacie obejmujemy wszystkie możliwości.
Anagram
Tak nazywamy słowo, które zawiera wszystkie litery innego słowa w tej samej liczbie, ale w innym porządku.
Postawienie zadania
Trzeba napisać funkcję, która sprawdza, czy dwa łańcuchy są anagramami, przy czym wielkość liter nie ma znaczenia. Liczone są tylko znaki; spacje lub znaki interpunkcyjne nie są brane pod uwagę.
anagram(‘finder’, ‘Friend’) -> true
anagram(‘hello’, ‘bye’) -> false
Analizujemy zadanie
Ważne jest, aby uwzględnić, że należy sprawdzić każdą literę w dwóch wejściowych łańcuchach i ich ilość w każdym łańcuchu.
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
Aby przechować dane anagramu, warto wybrać strukturę taką jak literał obiektowy JavaScript. Kluczem w tym przypadku jest znak litery, a wartością — liczba jej powtórzeń w danym łańcuchu.
Są też inne warunki:
- Należy upewnić się, że wielkość liter w porównaniach nie jest brana pod uwagę. Po prostu przekształcamy oba łańcuchy w małe lub wielkie litery.
- Wykluczamy z porównania wszystkie nie-znaki. Najlepiej pracować z .
Rozwiązanie
// 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
}Zwróć uwagę na użycie w powyższym fragmencie. Ta metoda zwraca tablicę, zawierającą nazwy lub klucze w takiej samej kolejności, w jakiej występują w obiekcie. W tym przypadku tablica będzie wyglądać tak:
[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]
Dzięki temu uzyskujemy właściwości obiektu bez potrzeby stosowania dużej pętli. W tym podejściu można wykorzystać właściwość .length – do sprawdzenia, czy obie ciągi mają tę samą liczbę znaków – to ważny aspekt anagramów.
Wyszukiwanie samogłoskowych
To stosunkowo proste zadanie, które często pojawia się podczas rozmów kwalifikacyjnych.
Postawienie zadania
Należy napisać funkcję, przyjmującą ciąg jako argument i zwracającą liczbę samogłoskowych, które znajdują się w tym ciągu.
Samogłoskami są „a”, „e”, „i”, „o”, „u”.
Przykład:
findVowels(‘hello’) // -> 2
findVowels(‘why’) // -> 0
Rozwiązanie
Oto najprostsza wersja:
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
}Ważne jest, aby zwrócić uwagę na stosowanie metody .includes(). Jest ona dostępna zarówno dla ciągów, jak i dla tablic. Powinna być używana do sprawdzenia, czy tablica zawiera określoną wartość. Ta metoda zwraca true, jeśli tablica zawiera wskazaną wartość, a false, jeśli nie.
Istnieje również bardziej zwięzłe rozwiązanie problemu:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matches.length : 0
}Tutaj wykorzystywana jest metoda .match(), która pozwala na skuteczne wyszukiwanie. Jeśli wyrażenie regularne jako argument metody zostanie znalezione we wskazanym ciągu, to wartością zwracaną staje się tablica dopasowanych znaków. Jeśli nie ma dopasowań, .match() zwraca null.
Fibonacci
Klasyczne zadanie, które można napotkać na rozmowach kwalifikacyjnych na różnych poziomach. Warto przypomnieć, że ciąg Fibonacciego to szereg liczb, gdzie każda kolejna jest sumą dwóch poprzednich. Tak więc, pierwsze dziesięć liczb wygląda następująco: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Postawienie zadania
Należy napisać funkcję, która zwraca n-ty wyraz w danym ciągu, gdzie n to liczba przekazywana jako argument funkcji.
fibonacci(3) // -> 2
To zadanie polega na wykonaniu pętli określoną liczbę razy, wskazaną w argumencie, z zwrotem wartości na odpowiedniej pozycji. Ten sposób formułowania zadania wymaga użycia pętli. Zamiast tego, użycie rekurencji może spodobać się rekruterowi i dać kilka dodatkowych punktów.
Rozwiązanie
const fibonacci = num => {
// przechowuj ciąg Fibonacciego, który zamierzasz
// wygenerować w tablicy i
// zainicjalizuj tablicę pierwszymi dwoma
// liczbami w tym ciągu
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// dodaj sumę dwóch liczb
// znajdujących się przed pozycją i w tablicy result
// na końcu tablicy result
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// zwróć ostatnią wartość w tablicy result
return result[num]
}W tablicy wyników pierwsze dwa liczby znajdują się w rzędzie, ponieważ każdy wpis w ciągu składa się z sumy dwóch poprzednich liczb. Na początku nie ma dwóch liczb, które można by wykorzystać do uzyskania następnej liczby, dlatego pętla nie może ich wygenerować automatycznie. Ale, jak wiemy, pierwsze dwie liczby to zawsze 0 i 1. Dlatego tablicę wyników można zainicjalizować ręcznie.
Jeśli chodzi o rekurencję, to tutaj jest łatwiej i trudniej jednocześnie:
const fibonacci = num => {
// jeśli num to 0 lub 1, zwróć num
if(num < 2) {
return num
}
// rekurencja tutaj
return fibonacci(num - 1) + fibonacci(num - 2)
}Kontynuujemy wywoływanie fibonacci(), przekazując coraz mniejsze liczby jako argumenty. Zatrzymujemy się, gdy przekazany argument wynosi 0 lub 1.
Wnioski
Prawdopodobnie już zetknąłeś się z dowolnym z wymienionych zadań, jeśli brałeś udział w rozmowach kwalifikacyjnych na stanowiska frontend- lub JavaScript-developera (szczególnie na poziomie junior). Ale jeśli tak nie było, mogą się przydać w przyszłości — przynajmniej dla ogólnego rozwoju.
Skillbox poleca:
- Kurs online .
- Kurs online .
- Praktyczny roczny kurs .
Źródło: habr.com
