5 typowych zadań rozmowy kwalifikacyjnej JavaScript: analiza i rozwiązania

5 typowych zadań rozmowy kwalifikacyjnej JavaScript: analiza i rozwiązania

Od tłumacza: opublikował dla Ciebie artykuł Maria Antonietta Perna, która opowiada o typowych zadaniach JavaScript, najczęściej oferowane kandydatom na programistów podczas rozmów kwalifikacyjnych. Artykuł przyda się przede wszystkim początkującym programistom.

Wywiady w firmach technologicznych od dawna są tematem rozmów w całym mieście. Nie powinno to dziwić – pomyślne zdanie rozmowy kwalifikacyjnej daje szansę na zdobycie dobrej pracy. Ale to nie jest takie proste, ponieważ często trzeba rozwiązać złożone problemy.

Co więcej, najczęściej większość tych zadań nie jest związana z pracą, którą będzie wykonywał wnioskodawca, ale nadal wymagają rozwiązania. Czasem trzeba to zrobić na tablicy, bez sprawdzania w Google czy innym źródle. Tak, sytuacja stopniowo się zmienia i część firm rezygnuje z takich rozmów kwalifikacyjnych, jednak wielu pracodawców nadal trzyma się tej tradycji. Artykuł ten poświęcony jest analizie typowych zadań JavaScript, które często wykorzystywane są jako zadania dla osób poszukujących pracy.

Przypomnienie: dla wszystkich czytelników „Habr” - rabat w wysokości 10 000 rubli przy zapisywaniu się na dowolny kurs Skillbox przy użyciu kodu promocyjnego „Habr”.

Skillbox poleca: Kurs praktyczny „Programista mobilny PRO”.

Najważniejsze jest, aby dokładnie przygotować się do rozmowy kwalifikacyjnej.

Tak, zanim zaczniemy przyglądać się zadaniom, przyjrzyjmy się ogólnym wskazówkom dotyczącym przygotowania do rozmowy kwalifikacyjnej.

Najważniejsze jest, aby przygotować się z wyprzedzeniem. Sprawdź, jak dobrze zapamiętujesz algorytmy i struktury danych oraz pogłębiaj swoją wiedzę w obszarach, z którymi nie jesteś zbyt zaznajomiony. Istnieje wiele platform internetowych, które mogą pomóc Ci przygotować się do rozmowy kwalifikacyjnej. Radzimy geeksforgeeks, Pramp, Wywiad.io и KodSygnał.

Warto nauczyć się wypowiadać decyzję na głos. Wskazane jest, aby opowiadać kandydatom o tym, czym się zajmujesz, a nie tylko pisać na tablicy (lub wpisywać kod do komputera, także po cichu). W ten sposób, jeśli popełnisz błąd w kodzie, ale rozwiązanie jest ogólnie poprawne, możesz zwiększyć swoje szanse na sukces.

Musisz zrozumieć problem, zanim zaczniesz go rozwiązywać. W niektórych przypadkach możesz zrozumieć zadanie powierzchownie, a następnie pójść niewłaściwą ścieżką. Być może warto zadać ankieterowi kilka pytań wyjaśniających.

Musisz ćwiczyć pisanie kodu ręcznie, a nie na komputerze. Zdarza się, że podczas rozmów kwalifikacyjnych kandydat otrzymuje marker i tablicę, na której nie ma podpowiedzi ani automatycznego formatowania. Szukając rozwiązania warto spisać swój kod na kartce papieru lub bezpośrednio na tablicy. Jeśli będziesz mieć wszystko w głowie, możesz zapomnieć o czymś ważnym.

Zadania szablonowe w JavaScript

Niektóre z tych zadań prawdopodobnie są Ci już znane. Byłeś na rozmowach kwalifikacyjnych, podczas których musiałeś rozwiązać podobny problem, albo ćwiczyłeś je podczas nauki JavaScript. Cóż, teraz nadszedł czas, aby rozwiązać je ponownie i szczegółowo wyjaśnić proces.

Palindrom

Palindrom to słowo, zdanie lub sekwencja znaków, które czyta się dokładnie tak samo zarówno w zwykłym kierunku, jak i w przeciwnym kierunku. Na przykład „Anna” jest palindromem, ale „stół” i „Jan” już nie.

Inscenizacja

Biorąc pod uwagę ciąg; musisz napisać funkcję, która pozwoli ci zwrócić wartość true, jeśli ciąg znaków jest palindromem, i wartość false, jeśli nie. W takim przypadku należy wziąć pod uwagę spacje i znaki interpunkcyjne.

palindrom('samochód wyścigowy') === prawda
palindrom('tabela') === fałsz

Przeanalizujmy zadanie

Główną ideą jest tutaj odwrócenie ciągu. Jeśli ciąg „odwrotny” jest całkowicie identyczny z oryginalnym, to otrzymaliśmy palindrom i funkcja powinna zwrócić wartość true. Jeśli nie, fałsz.

decyzja

Oto kod rozwiązujący 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('')
}

Pierwszym krokiem jest konwersja znaków w ciągu wejściowym na małe litery. To gwarancja, że ​​program porówna same znaki, a nie wielkość liter czy cokolwiek innego.

Drugim krokiem jest odwrócenie linii. Nie jest to trudne: musisz przekonwertować ją na tablicę za pomocą metody .split() (biblioteka String). Następnie odwracamy tablicę za pomocą .reverse() (biblioteka Array). Ostatnim krokiem jest konwersja tablicy odwrotnej na ciąg znaków przy użyciu funkcji .join() (biblioteka Array).

Teraz wszystko, co musisz zrobić, to porównać ciąg „odwrotny” z ciągiem oryginalnym i zwrócić wynik „prawda” lub „fałsz”.

FizzBuzz

Jedno z najpopularniejszych zadań na rozmowach kwalifikacyjnych.

Inscenizacja

Musisz napisać funkcję, która wypisuje na konsolę liczby od 1 do n, gdzie n jest liczbą całkowitą przyjmowaną przez funkcję jako parametr, z następującymi warunkami:

  • wyjście fizz zamiast wielokrotności 3;
  • generuj szum zamiast liczb będących wielokrotnościami 5;
  • fizzbuzz zamiast liczb będących wielokrotnościami 3 i 5.

Przykład

Fizzbuzz(5)

Doświadcz mocnych i skutecznych rezultatów

/ / 1
/ / 2
// mus
/ / 4
//brzęczeć

Przeanalizujmy zadanie

Najważniejszą rzeczą jest tutaj sposób na znalezienie wielokrotności za pomocą JavaScript. Można to zrealizować za pomocą operatora modułu lub reszty -%, co pozwala pokazać resztę z dzielenia dwóch liczb. Jeśli reszta wynosi 0, oznacza to, że pierwsza liczba jest wielokrotnością drugiej.

12% 5 // 2 -> 12 nie jest wielokrotnością 5
12% 3 // 0 -> 12 jest wielokrotnością 3

Zatem jeśli podzielisz 12 przez 5, otrzymasz 2 z resztą 2. Jeśli podzielisz 12 przez 3, otrzymasz 4 z resztą 0. W pierwszym przypadku 12 nie jest wielokrotnością 5, w drugim , 12 jest wielokrotnością 3.

decyzja

Optymalnym rozwiązaniem byłby następujący kod:

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

Funkcja przeprowadza niezbędne kontrole za pomocą instrukcji warunkowych i generuje wynik wymagany przez użytkownika. W zadaniu warto zwrócić uwagę na kolejność instrukcji if...else: zaczynać od podwójnego warunku (&&), a kończyć na przypadku, w którym nie udało się znaleźć wielu liczb. W rezultacie uwzględniamy wszystkie opcje.

Anagram

Jest to nazwa słowa zawierającego wszystkie litery innego słowa o tej samej liczbie, ale w innej kolejności.

Inscenizacja

Musimy napisać funkcję, która sprawdza, czy dwa ciągi znaków są anagramami, wielkość liter nie ma znaczenia. Liczone są tylko znaki; spacje i znaki interpunkcyjne nie są brane pod uwagę.

anagram('wyszukiwarka', 'Przyjaciel') —> prawda
anagram('cześć', 'pa') —> fałsz

Przeanalizujmy zadanie

Ważną rzeczą do rozważenia jest to, że musisz sprawdzić każdą literę w dwóch liniach wejściowych i ich liczbę w każdej linii.

wyszukiwarka —> f: 1 przyjaciel —> f: 1
ja: 1 r: 1
n: 1 i: 1
d: 1 e: 1
mi: 1 n: 1
r: 1 d: 1

Aby przechowywać dane anagramowe, powinieneś wybrać strukturę taką jak literał obiektowy JavaScript. Kluczem jest w tym przypadku charakter litery, wartością jest liczba jej powtórzeń w bieżącej linii.

Istnieją inne warunki:

  • Należy zadbać o to, aby przy porównywaniu nie brać pod uwagę wielkości liter. Po prostu konwertujemy oba ciągi znaków na małe lub wielkie litery.
  • Z porównania wykluczamy wszystkie znaki niebędące znakami. Najlepiej pracować wyrażenia regularne.

decyzja

// 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 Object.keys () we fragmencie powyżej. Ta metoda zwraca tablicę zawierającą nazwy lub klucze w tej samej kolejności, w jakiej pojawiają się w obiekcie. W tym przypadku tablica będzie wyglądać następująco:

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

W ten sposób uzyskujemy właściwości obiektu bez konieczności wykonywania pętli zbiorczej. W przypadku problemu możesz użyć tej metody z właściwością .length, aby sprawdzić, czy oba ciągi mają tę samą liczbę znaków - jest to ważna cecha anagramów.

Wyszukaj samogłoski

Dość proste zadanie, które często pojawia się na rozmowach kwalifikacyjnych.

Inscenizacja

Musisz napisać funkcję, która jako argument przyjmuje ciąg znaków i zwraca liczbę samogłosek zawartych w ciągu.
Samogłoski to „a”, „e”, „i”, „o”, „u”.

Przykład:

findVowels('cześć') // —> 2
findVowels('dlaczego') // —> 0

decyzja

Oto najprostsza opcja:

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 użycie metody .includes(). Jest dostępny zarówno dla ciągów, jak i tablic. Należy go używać do określenia, czy tablica zawiera określoną wartość. Ta metoda zwraca wartość true, jeśli tablica zawiera określoną wartość, i false, jeśli jej nie zawiera.

Istnieje krótsze rozwiązanie problemu:

const findVowels = str => {
  const matched = str.match(/[aeiou]/gi)
  return matched ? matches.length : 0
}

Wykorzystuje metodę .match(), która umożliwia wdrożenie wydajnego wyszukiwania. Jeśli w określonym ciągu zostanie znalezione wyrażenie regularne jako argument metody, wartością zwracaną będzie tablica pasujących znaków. Cóż, jeśli nie ma żadnych dopasowań, funkcja .match() zwraca wartość null.

Fibonacci

Klasyczne zadanie, które można spotkać na rozmowach kwalifikacyjnych na różnych poziomach. Warto przypomnieć, że ciąg Fibonacciego to ciąg liczb, gdzie każda kolejna jest sumą dwóch poprzednich. Zatem pierwsze dziesięć liczb wygląda następująco: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Inscenizacja

Musisz napisać funkcję, która zwraca n-ty rekord w określonej kolejności, gdzie n jest liczbą przekazywaną jako argument do funkcji.

fibonacci(3) // —> 2

Zadanie to polega na przejściu przez pętlę określoną w argumencie liczbę razy i zwróceniu wartości na odpowiedniej pozycji. Takie postawienie problemu wymaga użycia pętli. Jeśli zamiast tego użyjesz rekurencji, może to zadowolić osobę przeprowadzającą rozmowę i dać ci kilka dodatkowych punktów.

decyzja

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

W tablicy wyników pierwsze dwie liczby znajdują się w serii, ponieważ każdy wpis w sekwencji jest sumą dwóch poprzednich liczb. Na samym początku nie ma dwóch liczb, z których można wyciągnąć następną liczbę, więc pętla nie może ich wygenerować automatycznie. Ale, jak wiemy, pierwsze dwie liczby to zawsze 0 i 1. Dlatego możesz ręcznie zainicjować tablicę wyników.

Jeśli chodzi o rekurencję, wszystko jest prostsze i bardziej skomplikowane jednocześnie:

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

Ciągle wywołujemy funkcję fibonacci(), przekazując coraz mniejsze liczby jako argumenty. Zatrzymujemy się, gdy przekazany argument ma wartość 0 lub 1.

Wniosek

Najprawdopodobniej spotkałeś się już z którymkolwiek z tych zadań, jeśli byłeś na rozmowie kwalifikacyjnej na stanowisko programisty frontendowego lub JavaScript (szczególnie jeśli jest to poziom junior). Ale jeśli się z nimi nie spotkałeś, mogą przydać się w przyszłości – przynajmniej do ogólnego rozwoju.

Skillbox poleca:

Źródło: www.habr.com

Dodaj komentarz