5 ердийн JavaScript ярилцлагын даалгавар: дүн шинжилгээ ба шийдэл

5 ердийн JavaScript ярилцлагын даалгавар: дүн шинжилгээ ба шийдэл

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

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

Түүнээс гадна ихэнх тохиолдолд эдгээр ажлуудын ихэнх нь өргөдөл гаргагчийн хийх ажилтай холбоогүй боловч тэдгээрийг шийдвэрлэх шаардлагатай хэвээр байна. Заримдаа та үүнийг Google эсвэл өөр эх сурвалжаас шалгахгүйгээр самбар дээр хийх хэрэгтэй болдог. Тийм ээ, нөхцөл байдал аажмаар өөрчлөгдөж, зарим компаниуд ийм ярилцлагаас татгалзаж байгаа ч олон ажил олгогчид энэ уламжлалыг баримталсаар байна. Энэ нийтлэл нь ажил хайгчдад ихэвчлэн ашиглагддаг ердийн JavaScript даалгавруудын дүн шинжилгээнд зориулагдсан болно.

Бид танд сануулж байна: "Хабр" -ын бүх уншигчдад - "Habr" сурталчилгааны кодыг ашиглан Skillbox-ын аль ч курст бүртгүүлэхдээ 10 рублийн хөнгөлөлт.

Skillbox зөвлөж байна: Практик курс "Мобайл хөгжүүлэгч PRO".

Хамгийн гол нь ярилцлагадаа сайтар бэлдэх хэрэгтэй.

Тийм ээ, даалгавруудыг харж эхлэхээсээ өмнө ярилцлагад бэлтгэх ерөнхий зөвлөмжийг авч үзье.

Хамгийн гол нь урьдчилан бэлтгэх явдал юм. Алгоритм болон өгөгдлийн бүтцийг хэр сайн санаж байгаагаа шалгаж, сайн мэдэхгүй байгаа чиглэлээр мэдлэгээ сайжруулаарай. Ярилцлагад бэлтгэхэд тань туслах олон онлайн платформууд байдаг. Бид зөвлөж байна geeksforgeeks, Прамп, Interviewing.io и Код дохио.

Шийдвэрээ чангаар хэлж сурах нь зүйтэй. Өргөдөл гаргагчдад юу хийж байгаагаа хэлэхийг зөвлөж байна, зөвхөн самбар дээр бичээд зогсохгүй (эсвэл компьютерт код бичээрэй, бас чимээгүйхэн). Ингэснээр та кодонд алдаа гаргасан ч шийдэл нь ерөнхийдөө зөв байвал амжилтанд хүрэх боломжоо нэмэгдүүлэх боломжтой.

Та асуудлыг шийдэж эхлэхээсээ өмнө асуудлыг ойлгох хэрэгтэй. Зарим тохиолдолд та аливаа ажлыг өнгөцхөн ойлгоод буруу замаар явж болно. Ярилцлага авагчаас тодруулах хэд хэдэн асуулт асуух нь зүйтэй болов уу.

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

JavaScript дээрх загвар даалгаврууд

Эдгээр ажлуудын зарим нь танд аль хэдийн танил болсон байх. Та үүнтэй төстэй зүйлийг шийдвэрлэх шаардлагатай ярилцлага хийсэн эсвэл JavaScript-г сурах явцдаа дадлага хийсэн. За, одоо тэдгээрийг дахин шийдвэрлэх цаг болжээ, мөн үйл явцын нарийвчилсан тайлбартай.

Палиндром

Палиндром гэдэг нь ердийн чиглэлд болон эсрэг чиглэлд яг адилхан уншигдах үг, өгүүлбэр эсвэл тэмдэгтүүдийн дараалал юм. Жишээлбэл, "Анна" нь палиндром боловч "ширээ", "Жон" нь тийм биш юм.

Тайзан

Мөр өгсөн; хэрэв мөр нь палиндром бол үнэн, үгүй ​​бол худал гэж буцаах функцийг бичих хэрэгтэй. Энэ тохиолдолд та хоосон зай, цэг таслалыг анхаарч үзэх хэрэгтэй.

палиндром('уралдааны машин') === үнэн
палиндром('хүснэгт') === худал

Даалгавраа дүн шинжилгээ хийцгээе

Энд гол санаа нь мөрийг эргүүлэх явдал юм. Хэрэв "урвуу" мөр нь анхны мөртэй бүрэн ижил байвал бид палиндром хүлээн авсан бөгөөд функц үнэнийг буцаана. Үгүй бол худлаа.

шийдвэр

Палиндромыг шийдэх код энд байна.

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 он
// шуугиан

Даалгавраа дүн шинжилгээ хийцгээе

Энд гол зүйл бол JavaScript ашиглан үржвэр олох арга юм. Үүнийг модулийн оператор эсвэл үлдэгдэл - % ашиглан хэрэгжүүлж болох бөгөөд энэ нь хоёр тоог хуваах үед үлдэгдлийг харуулах боломжийг олгодог. Хэрэв үлдэгдэл нь 0 бол эхний тоо нь хоёр дахь тоон үржвэр болно гэсэн үг юм.

12% 5 // 2 -> 12 нь 5-ын үржвэр биш
12% 3 // 0 -> 12 нь 3-ын үржвэр юм

Тэгэхээр 12-ыг 5-д хуваавал 2-ын үлдэгдэл 2-ыг 12-т хуваавал 3-ийн үлдэгдэлтэй 4-ийг авна.Эхний тохиолдолд 0 нь 12-ын үржвэр биш, хоёрдугаарт. , 5 нь 12-ын үржвэр юм.

шийдвэр

Хамгийн оновчтой шийдэл нь дараах код байх болно.

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('ологч', 'Найз') —> үнэн
anagram('сайн уу', 'баяртай') —> худал

Даалгавраа дүн шинжилгээ хийцгээе

Энд анхаарах чухал зүйл бол та хоёр оролтын мөрөнд байгаа үсэг тус бүр, мөр бүрт тэдгээрийн дугаарыг шалгах хэрэгтэй.

олдог —> f: 1 найз —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 өдөр: 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('сайн уу') // —> 2
findVowels('яагаад') // —> 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

сэтгэгдэл нэмэх