5 типтүү JavaScript интервью милдеттери: талдоо жана чечүү

5 типтүү JavaScript интервью милдеттери: талдоо жана чечүү

Котормочудан: сиз үчүн макала жарыялады Мария Антониетта Перна, жалпы JavaScript тапшырмалары жөнүндө айтып берет, көбүнчө интервью учурунда иштеп чыгуучуларга сунуш кылынат. Макала, биринчи кезекте, башталгыч программисттер үчүн пайдалуу болот.

Технологиялык компаниялардагы интервьюлар көптөн бери элдин талкуусуна түшүп келет. Бул таң калыштуу эмес - интервьюдан ийгиликтүү өтүү сизге жакшы жумушка орношуу мүмкүнчүлүгүн берет. Бирок бул анчалык деле жөнөкөй эмес, анткени татаал көйгөйлөр көп учурда чечилиши керек.

Анын үстүнө, көбүнчө, бул милдеттердин көбү өтүнмө ээси аткара турган иш менен байланыштуу эмес, бирок алар дагы эле чечилиши керек. Кээде Google же башка булактан текшербей туруп, тактада жасоого туура келет. Ооба, кырдаал акырындык менен өзгөрүп, кээ бир компаниялар мындай интервьюлардан баш тартып жатышат, бирок көптөгөн иш берүүчүлөр дагы эле бул салтты карманышат. Бул макала көбүнчө жумуш издөөчүлөр үчүн тапшырмалар катары колдонулган типтүү JavaScript тапшырмаларын талдоого арналган.

Биз эсиңизге салабыз: "Хабрдын" бардык окурмандары үчүн - "Habr" промо-кодун колдонуу менен каалаган Skillbox курсуна катталганда 10 000 рубль арзандатуу.

Skillbox сунуштайт: Практикалык курс "Мобилдик иштеп чыгуучу PRO".

Эң негизгиси интервьюңузга кылдат даярданыңыз.

Ооба, биз тапшырмаларды карап баштоодон мурун, келгиле, интервьюга даярдануунун кээ бир жалпы кеңештерин карап көрөлү.

башкы нерсе - алдын ала даярдоо. Алгоритмдерди жана маалымат структураларын канчалык жакшы эстеп жатканыңызды сынап көрүңүз жана сиз жакшы билбеген тармактарда билимиңизди өркүндөтүңүз. Интервьюга даярданууга жардам бере турган көптөгөн онлайн платформалар бар. кеңеш беребиз geeksforgeeks, Pramp, Interviewing.io и CodeSignal.

Бул чечимди үн чыгарып айтууну үйрөнүү керек. Абитуриенттерге эмне кылып жатканыңызды айтып берүү сунушталат, ал жөн гана доскага жазып койбостон (же компьютерге кодду үнсүз териңиз). Ошентип, эгер сиз коддо ката кетирсеңиз, бирок чечим жалпысынан туура болсо, ийгиликке жетүү мүмкүнчүлүгүңүздү жогорулата аласыз.

Көйгөйдү чечүүдөн мурун аны түшүнүшүңүз керек. Кээ бир учурларда, сиз бир ишти үстүртөн түшүнүп, анан туура эмес жолго түшүп кетишиңиз мүмкүн. Интервью алуучуга бир нече тактоочу суроолорду берип коюу туура болушу мүмкүн.

Кодду компьютерде эмес, кол менен жазып машыгышыңыз керек. Маектешүү учурунда өтүнмө ээсине маркер жана доска берилет, анда эч кандай кыйытмалар же автоматтык форматтоо жок. Чечүүнү издеп жатканда, кодуңузду кагазга же түздөн-түз тактага жазып алганыңыз оң. Эгер баарын башыңызда сактасаңыз, маанилүү нерсени унутуп коюшуңуз мүмкүн.

JavaScript'те шаблон тапшырмалары

Бул тапшырмалардын кээ бирлери сизге мурунтан эле тааныш болсо керек. Сизге окшош нерсени чечишиңиз керек болгон интервьюлар болду же JavaScript үйрөнүп жатканда алар боюнча машыгдыңыз. Ооба, азыр кайра аларды чечүү үчүн убакыт келди, жана жараяндын деталдуу түшүндүрүү менен.

Палиндрома

Палиндрома – кадимки багытта да, карама-каршы багытта да так окулган сөз, сүйлөм же символдордун ырааттуулугу. Мисалы, "Анна" палиндром, ал эми "стол" жана "Джон" эмес.

продукция

сап берилген; эгер сап палиндром болсо, чындыкты, эгер андай эмес болсо, жалганды кайтарууга мүмкүндүк берүүчү функцияны жазуу керек. Бул учурда, боштуктарды жана тыныш белгилерин эске алуу керек.

palindrome('жарыш машинасы') === чын
палиндром('таблица') === жалган

Келгиле, тапшырманы талдап көрөлү

Бул жерде негизги идея сапты артка кайтаруу болуп саналат. Эгерде "тескери" сап түпкү сапка толугу менен окшош болсо, анда биз палиндромду алдык жана функция чындыкка кайтып келиши керек. Болбосо, жалган.

чечим

Бул жерде палиндромду чечүүчү код.

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() (массив китепканасы) аркылуу тескери салабыз. Акыркы кадам .join() (массив китепканасы) аркылуу тескери массивди сапка айландыруу.

Эми сизге керек болгон нерсе - "кайтарым" сапты баштапкы сап менен салыштырып, натыйжаны чын же жалган деп кайтарыңыз.

FizzBuzz

Интервьюдагы эң популярдуу тапшырмалардын бири.

продукция

Консолго 1ден nге чейинки сандарды басып чыгарган функцияны жазышыңыз керек, мында n функция параметр катары кабыл алган бүтүн сан, төмөнкү шарттар менен:

  • 3кө эселиктердин ордуна fizz чыгаруу;
  • 5ке эселенген сандардын ордуна ызы-чуу чыгаруу;
  • 3 менен 5ке тең эселенген сандардын ордуна fizzbuzz чыгаруу.

мисал

Fizzbuzz(5)

жыйынтык

// 1
// 2
// fizz
// 4
//buzz

Келгиле, тапшырманы талдап көрөлү

Бул жерде негизги нерсе 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('finder', 'Friend') —> чын
anagram('салам', 'кош') —> false

Келгиле, тапшырманы талдап көрөлү

Бул жерде эске ала турган маанилүү нерсе, сиз эки киргизүү сапындагы ар бир тамганы жана ар бир сапта алардын санын текшерүү керек.

тапкыч —> 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 касиети менен колдонсоңуз болот, бул эки сапта тең символдордун саны бирдей экендигин текшерүү үчүн - бул анаграммалардын маанилүү өзгөчөлүгү.

Үндүүлөрдү издөө

Жөнөкөй иш, ал интервьюларда көп кездешет.

продукция

Сиз сапты аргумент катары алып, сапта камтылган үндүүлөрдүн санын кайтарган функцияны жазышыңыз керек.
Үндүү тыбыштар “а”, “е”, “и”, “о”, “у”.

мисалы:

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() ыкмасын колдонууга көңүл буруу маанилүү. Ал саптар жана массивдер үчүн жеткиликтүү. Ал массивде белгилүү бир маани бар же жок экенин аныктоо үчүн колдонулушу керек. Бул ыкма массивде көрсөтүлгөн маанини камтыса "чындыкты", ал эми жок болсо "false" кайтарат.

Көйгөйдүн кыскараак чечими бар:

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

Бул эффективдүү издөөнү ишке ашырууга мүмкүндүк берген .match() ыкмасын колдонот. Метод аргументи катары регулярдуу туюнтма көрсөтүлгөн саптын ичинде табылса, анда кайтаруучу маани дал келген символдордун массиви болуп саналат. Ооба, эгерде дал келүүлөр жок болсо, анда .match() нөлдү кайтарат.

фибоначчи

Ар кандай деңгээлдеги интервьюлардан тапса болот классикалык тапшырма. Бул Fibonacci ырааттуулугу ар бир кийинки мурунку эки суммасы болуп саналган бир катар сандар экенин эстен чыгарбоо керек. Ошентип, биринчи он сандар мындай көрүнөт: 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 болгондо токтойбуз.

жыйынтыктоо

Кыязы, эгер сиз фронт же JavaScript иштеп чыгуучу жумушу үчүн интервью алган болсоңуз (айрыкча, эгерде ал кенже деңгээлде болсо) бул тапшырмалардын бирине туш болгонсуз. Бирок, эгер сиз аларды кезиктире элек болсоңуз, алар келечекте пайдалуу болушу мүмкүн - жок дегенде жалпы өнүгүү үчүн.

Skillbox сунуштайт:

Source: www.habr.com

Комментарий кошуу