5 типични задачи за интервју на JavaScript: анализа и решенија

5 типични задачи за интервју на JavaScript: анализа и решенија

Од преведувачот: објави статија за вас Марија Антониета Перна, која зборува за заеднички JavaScript задачи, најчесто им се нуди на апликантите за програмери за време на интервјуата. Написот ќе биде корисен, пред сè, за почетниците програмери.

Интервјуата во технолошките компании долго време се тема на разговор. Ова не треба да изненадува - успешното поминување на интервју ви дава можност да добиете добра работа. Но, ова не е толку едноставно, бидејќи сложените проблеми честопати треба да се решат.

Притоа, најчесто, повеќето од овие задачи не се поврзани со работата што ќе ја изврши барателот, но сепак треба да се решат. Понекогаш треба да го направите тоа на табла, без да проверите со Google или кој било друг извор. Да, ситуацијата постепено се менува, а некои компании ги напуштаат ваквите интервјуа, но многу работодавци сè уште се придржуваат до оваа традиција. Оваа статија е посветена на анализа на типични JavaScript задачи кои често се користат како задачи за оние кои бараат работа.

Потсетуваме: за сите читатели на „Хабр“ - попуст од 10 рубли при запишување на кој било курс Skillbox користејќи го промотивниот код „Хабр“.

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

Главната работа е темелно да се подготвите за вашето интервју.

Да, пред да почнеме да ги разгледуваме задачите, да погледнеме неколку општи совети за подготовка за интервју.

Главната работа е да се подготви однапред. Тестирајте колку добро ги паметите алгоритмите и структурите на податоци и подобрете го вашето знаење во области кои не сте премногу запознаени. Постојат многу онлајн платформи кои можат да ви помогнат да се подготвите за интервјуа. Ние советуваме geeksforgeeks, Прамп, Интервјуирање.io и CodeSignal.

Вреди да научите да ја кажувате одлуката гласно. Препорачливо е да им кажете на апликантите што правите, а не само да пишувате на таблата (или да пишувате код во компјутерот, исто така тивко). На овој начин, ако направите грешка во кодот, но решението е генерално точно, можете да ги зголемите вашите шанси за успех.

Треба да го разберете проблемот пред да започнете да го решавате. Во некои случаи, може да ја разберете задачата површно, а потоа да тргнете по погрешен пат. Можеби вреди да му поставите неколку појаснувачки прашања на интервјуерот.

Треба да вежбате да пишувате код рачно, а не на компјутер. Се случува за време на интервјуата на апликантот да му се даде маркер и табла, каде што нема навестувања или автоматско форматирање. Кога барате решение, вреди да го запишете вашиот код на парче хартија или директно на таблата. Ако чувате сè во вашата глава, можеби ќе заборавите нешто важно.

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

Некои од овие задачи веројатно веќе ви се познати. Сте имале или интервјуа каде сте морале да решите нешто слично, или сте вежбале на нив додека учеле JavaScript. Па, сега е време да ги решиме повторно, и со детално објаснување на процесот.

Палиндром

Палиндром е збор, реченица или низа од знаци што се читаат сосема исто и во вообичаената и во спротивна насока. На пример, „Ана“ е палиндром, но „маса“ и „Јован“ не се.

Стадинг

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

palindrome ('тркачки автомобил') === точно
палиндром('табела') === неточно

Ајде да ја анализираме задачата

Главната идеја овде е да се преврти низата. Ако низата „обратна“ е целосно идентична со оригиналната, тогаш добивме палиндром и функцијата треба да се врати 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 library). Потоа ја превртуваме низата користејќи .reverse() (Array Library). Последниот чекор е да се конвертира обратната низа во низа користејќи .join() (Библиотека низа).

Сега се што треба да направите е да ја споредите низата „обратна“ со оригиналната низа, враќајќи го резултатот вистинит или неточен.

FizzBuzz

Една од најпопуларните задачи на интервјуата.

Стадинг

Треба да напишете функција која печати броеви од 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: започнете со двоен услов (&&) и завршете со случајот каде што не можеа да се најдат повеќе броеви. Како резултат на тоа, ги покриваме сите опции.

Анаграм

Ова е името за збор што ги содржи сите букви од друг збор во ист број, но во различен редослед.

Стадинг

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

anagram ('пронаоѓач', 'пријател') —> точно
анаграм ('здраво', 'чао') —> лажно

Ајде да ја анализираме задачата

Она што треба да се земе предвид овде е дека треба да ја проверите секоја буква во двете влезни линии и нивниот број во секоја линија.

пронаоѓач —> f: 1 пријател —> f: 1
јас: 1 r: 1
n: 1 и: 1
г: 1 е: 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 за да проверите дали двете низи имаат ист број на знаци - ова е важна карактеристика на анаграмите.

Пребарајте самогласки

Прилично едноставна задача што често се појавува на интервјуа.

Стадинг

Треба да напишете функција која зема низа како аргумент и го враќа бројот на самогласки што се содржани во низата.
Самогласките се „а“, „е“, „и“, „о“, „у“.

Пример:

find Vowels ('здраво') // —> 2
find Vowels ('зошто') // —> 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(). Достапно е и за низи и за низи. Треба да се користи за да се утврди дали низата содржи одредена вредност. Овој метод враќа точно ако низата ја содржи одредената вредност и неточно ако не ја содржи.

Постои пократко решение за проблемот:

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

Ова го користи методот .match(), кој ви овозможува да спроведете ефикасно пребарување. Ако во наведената низа се најде регуларен израз како аргумент на методот, тогаш повратната вредност е низа од знаци што се совпаѓаат. Па, ако нема совпаѓања, тогаш .match() враќа null.

Фибоначи

Класична задача што може да се најде во интервјуа на различни нивоа. Вреди да се потсетиме дека низата Фибоначи е серија од броеви каде секој нареден е збир на претходните два. Значи, првите десет броеви изгледаат вака: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Стадинг

Треба да напишете функција која го враќа n-тиот запис во одредена низа, при што n е бројот што се пренесува како аргумент на функцијата.

фибоначи(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

Додадете коментар