5 тыпавых задач на сумоўях па JavaScript: разбор і рашэнні

5 тыпавых задач на сумоўях па JavaScript: разбор і рашэнні

Ад перакладчыка: апублікавалі для вас артыкул Марыі Перна (Maria Antonietta Perna), якая распавядае аб тыпавых задачах па JavaScript, часцей за ўсё прапанаваных суіскальнікам-распрацоўшчыкам на сумоўях. Артыкул будзе карысны, у першую чаргу, пачаткоўцам праграмістам.

Гутаркі ў тэхналагічных кампаніях даўно сталі прыпавесцю ва языцех. Дзівіцца гэтаму не даводзіцца - паспяховае праходжанне інтэрв'ю дае магчымасць атрымаць добрую працу. Але гэта не так проста, паколькі часта неабходна вырашаць складаныя задачы.

Прычым часцей за ўсё большасць гэтых задач не маюць дачынення да працы, якую будзе выконваць суіскальнік, але вырашаць іх усё роўна трэба. Часам даводзіцца рабіць гэта на дошцы, без зверкі з Google або любой іншай крыніцай. Так, сітуацыя паступова мяняецца, і ў некаторых кампаніях ад такіх сумоўяў адмаўляюцца, але мноства працадаўцаў усё яшчэ прытрымліваецца гэтай традыцыі. Гэты артыкул прысвечана разбору тыпавых JavaScript-задач, якія часта выкарыстоўваюцца ў якасці заданняў для суіскальнікаў.

Нагадваем: для ўсіх чытачоў "Хабра" - зніжка 10 000 рублёў пры запісе на любы курс Skillbox па промакодзе "Хабр".

Skillbox рэкамендуе: Практычны курс «Мабільны распрацоўшчык PRO».

Галоўнае - старанная падрыхтоўка да вашай гутаркі

Так, перш чым пачаць разбіраць задачы, давайце разгледзім агульныя парады па падрыхтоўцы да інтэрв'ю.

Галоўнае - рыхтавацца загадзя. Праверце, наколькі добра вы падушыце алгарытмы і структуры дадзеных, і падцягніце веды ў тых галінах, якія вам не занадта добра знаёмыя. Ёсць нямала анлайн-платформ, якія дапамогуць падрыхтавацца да праходжання сумоўяў. Раім вылюдкі, Pramp, Interviewing.io и CodeSignal.

Варта навучыцца прагаворваць рашэнне ўслых. Пажадана расказваць суіскальнікам аб тым, што вы робіце, а не проста пісаць на дошцы (ці ж набіраць код у кампутары, таксама моўчкі). Такім чынам, калі ў кодзе вы дапусціце памылку, але ход рашэння будзе ўвогуле правільным, можна павялічыць свае шанцы на поспех.

Задачу трэба асэнсаваць, перш чым прыступіць да рашэння. У некаторых выпадках можна павярхоўна зразумець заданне і затым пайсці па няслушным шляху. Магчыма, варта задаць некалькі ўдакладняючых пытанняў інтэрв'юеру.

Трэба патрэніравацца пісаць код уручную, а не на ПК. Бывае, што на сумоўях суіскальніку даюць маркер і дошку, дзе няма ні падказак, ні аўтаматычнага фарматавання. Пры пошуку рашэння варта запісаць свой код на лісце паперы ці проста на дошцы. Калі трымаць усё ў галаве, можна забыцца што-небудзь важнае.

Шаблонныя задачы на ​​JavaScript

Верагодна, якія-небудзь з гэтых задач ужо вам ужо знаёмыя. Вы альбо праходзілі гутаркі, дзе трэба было вырашаць нешта падобнае, альбо практыкаваліся на іх падчас вывучэння JavaScript. Ну а зараз прыйшоў час вырашыць іх яшчэ раз, прычым з падрабязным тлумачэннем працэсу.

Паліндром

Паліндром - слова, прапанова або паслядоўнасць сімвалаў, якая абсалютна аднолькава чытаецца як у звыклым кірунку, так і ў зваротным. Да прыкладу, "Anna" - гэта паліндром, а "table" і "John" - не.

пастаноўка

Дадзены радок; трэба напісаць функцыю, якая дазваляе вярнуць значэнне true, калі радок з'яўляецца паліндромам, і false - калі не. Пры гэтым трэба ўлічваць прабелы і знакі прыпынку.

palindrome('racecar') === true
palindrome('table') === false

Разбіраны заданне

Асноўная ідэя тут - перавярнуць радок у зваротным кірунку. Калі "рэверсны" радок цалкам ідэнтычная зыходнай, значыць, мы атрымалі паліндром і функцыя павінна вярнуць значэнне true. Калі ж не - false.

рашэнне

Вось код, які дазваляе вырашыць паліндром.

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() (бібліятэка 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 is not a multiple of 5
12 % 3 // 0 -> 12 is multiple of 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('finder', 'Friend') -> true
anagram('hello', 'bye') -> false

Разбіраны заданне

Тут важна ўлічваць, што неабходна правяраць кожную літару ў двух уваходных радках і іх колькасць у кожным радку.

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
}

Звярніце ўвагу на выкарыстанне Object.keys() у Сніпэце вышэй. Гэты метад вяртае масіў, утрымоўвальны імёны ці ключы ў такім жа парадку, у якім яны сустракаюцца ў аб'екце. У гэтым выпадку масіў будзе такім:

['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 ? matches.length : 0
}

Тут задзейнічаны метад .match(), які дазваляе рэалізаваць эфектыўны пошук. Калі рэгулярнае выраз як аргумент метаду выяўлена ўсярэдзіне паказанага радка, то якое вяртаецца значэннем становіцца масіў супадальных знакаў. Ну а калі супадзенняў няма, тое .match() вяртае null.

Фібаначы

Класічная задача, якую можна сустрэць на сумоўях самага рознага ўзроўню. Варта нагадаць, што паслядоўнасць Фібаначы - гэта шэраг лікаў, дзе кожнае наступнае з'яўляецца сумай двух папярэдніх. Так, першыя дзесяць лікаў выглядаюць наступным чынам: 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-распрацоўніка (асабліва калі гэта ўзровень junior). Але калі яны вам і не трапляліся, то могуць спатрэбіцца ў будучыні - як мінімум для агульнага развіцця.

Skillbox рэкамендуе:

Крыніца: habr.com

Дадаць каментар