5 ta odatiy JavaScript intervyu vazifasi: tahlil va yechimlar

5 ta odatiy JavaScript intervyu vazifasi: tahlil va yechimlar

Tarjimondan: siz uchun maqola chop etdi Mariya Antonietta Perna, u umumiy JavaScript vazifalari haqida gapiradi, ko'pincha ishlab chiquvchi arizachilarga intervyu paytida taklif etiladi. Maqola, birinchi navbatda, yangi boshlanuvchi dasturchilar uchun foydali bo'ladi.

Texnologik kompaniyalardagi intervyular uzoq vaqtdan beri shaharning nutqi bo'lib kelgan. Buning ajablanarli joyi yo'q - intervyudan muvaffaqiyatli o'tish sizga yaxshi ishga kirish imkoniyatini beradi. Ammo bu juda oddiy emas, chunki murakkab muammolarni ko'pincha hal qilish kerak.

Bundan tashqari, ko'pincha, bu vazifalarning aksariyati arizachi bajaradigan ish bilan bog'liq emas, lekin ular hali ham hal qilinishi kerak. Ba'zan buni Google yoki boshqa manbalardan tekshirmasdan, doskada qilishingiz kerak bo'ladi. Ha, vaziyat asta-sekin o'zgarib bormoqda va ba'zi kompaniyalar bunday intervyulardan voz kechishmoqda, ammo ko'plab ish beruvchilar hali ham bu an'anaga rioya qilishadi. Ushbu maqola ko'pincha ish izlovchilar uchun vazifalar sifatida ishlatiladigan odatiy JavaScript vazifalarini tahlil qilishga bag'ishlangan.

Sizga eslatib o'tamiz: "Habr" ning barcha o'quvchilari uchun - "Habr" promo-kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Skillbox tavsiya qiladi: Amaliy kurs "Mobil dasturchi PRO".

Asosiysi, suhbatingizga puxta tayyorgarlik ko'rish.

Ha, vazifalarni ko'rib chiqishni boshlashdan oldin, suhbatga tayyorgarlik ko'rish bo'yicha umumiy maslahatlarni ko'rib chiqaylik.

Asosiysi, oldindan tayyorgarlik ko'rish. Algoritmlar va ma'lumotlar tuzilmalarini qanchalik yaxshi eslab qolganingizni sinab ko'ring va sizga unchalik tanish bo'lmagan sohalarda bilimingizni oshiring. Suhbatga tayyorgarlik ko'rishga yordam beradigan ko'plab onlayn platformalar mavjud. maslahat beramiz geeksforgeeks, Pramp, Interviewing.io и CodeSignal.

Qarorni ovoz chiqarib aytishni o'rganishga arziydi. Abituriyentlarga nima qilayotganingiz haqida aytib berish tavsiya etiladi, shunchaki doskaga yozmang (yoki kompyuterga kod kiriting, shuningdek, jimgina). Shunday qilib, agar siz kodda xatoga yo'l qo'ysangiz, lekin yechim umuman to'g'ri bo'lsa, muvaffaqiyatga erishish imkoniyatingizni oshirishingiz mumkin.

Muammoni hal qilishni boshlashdan oldin uni tushunishingiz kerak. Ba'zi hollarda siz biron bir vazifani yuzaki tushunib, keyin noto'g'ri yo'ldan ketishingiz mumkin. Suhbatdoshga bir nechta aniq savollar berishga arziydi.

Kod yozishni kompyuterda emas, qo'lda mashq qilishingiz kerak. Suhbat davomida abituriyentga marker va doska beriladi, bu erda maslahatlar yoki avtomatik formatlash mavjud emas. Yechim izlayotganda, kodingizni qog'ozga yoki to'g'ridan-to'g'ri doskaga yozib qo'yishga arziydi. Agar siz hamma narsani boshingizda saqlasangiz, muhim narsani unutishingiz mumkin.

JavaScript-da shablon vazifalari

Ushbu vazifalarning ba'zilari sizga allaqachon tanish bo'lishi mumkin. Siz shunga o'xshash narsani hal qilishingiz kerak bo'lgan intervyularni o'tkazgansiz yoki JavaScript-ni o'rganayotganda ular ustida mashq qilgansiz. Xo'sh, endi ularni yana hal qilish vaqti keldi va jarayonni batafsil tushuntirish bilan.

Palindrom

Palindrom - bu odatiy yo'nalishda ham, teskari yo'nalishda ham bir xil o'qiladigan so'z, jumla yoki belgilar ketma-ketligi. Misol uchun, "Anna" palindrom, ammo "stol" va "Jon" emas.

Staging

Bir qator berilgan; agar satr palindrom bo'lsa rost, bo'lmasa yolg'onni qaytarishga imkon beruvchi funksiya yozishingiz kerak. Bunday holda siz bo'shliqlar va tinish belgilarini hisobga olishingiz kerak.

palindrom('poyga mashinasi') === rost
palindrom('jadval') === noto'g'ri

Keling, vazifani tahlil qilaylik

Bu erda asosiy g'oya ipni orqaga qaytarishdir. Agar "teskari" satr asl qatorga to'liq o'xshash bo'lsa, biz palindrom oldik va funktsiya haqiqatga qaytishi kerak. Agar yo'q bo'lsa, noto'g'ri.

qaror

Mana palindromni hal qiladigan kod.

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

Birinchi qadam kirish qatoridagi belgilarni kichik harflarga aylantirishdir. Bu dastur personajlarni o'zlari bilan solishtirishi kafolati bo'lib, hodisa yoki boshqa narsalarni emas.

Ikkinchi qadam - chiziqni teskari aylantirish. Buni qilish qiyin emas: uni .split() usuli (String kutubxonasi) yordamida massivga aylantirish kerak. Keyin .reverse() (Array kutubxonasi) yordamida massivni teskari aylantiramiz. Oxirgi qadam teskari massivni .join() (massiv kutubxonasi) yordamida satrga aylantirishdir.

Endi siz qilishingiz kerak bo'lgan yagona narsa "teskari" satrni asl satr bilan taqqoslash, natijani haqiqiy yoki noto'g'ri qaytarishdir.

FizzBuzz

Intervyudagi eng mashhur vazifalardan biri.

Staging

Konsolga 1 dan n gacha raqamlarni chop etuvchi funksiyani yozishingiz kerak, bunda n funksiya parametr sifatida qabul qiladigan butun son, quyidagi shartlar bilan:

  • 3 ning ko'paytmalari o'rniga fizzni chiqarish;
  • 5 ga karrali raqamlar o'rniga buzzni chiqarish;
  • 3 va 5 ga karrali raqamlar o'rniga fizzbuzz chiqishi.

misol

Fizzbuzz(5)

natija

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

Keling, vazifani tahlil qilaylik

Bu erda asosiy narsa JavaScript yordamida ko'paytmalarni topish usulidir. U modul operatori yoki qolgan - % yordamida amalga oshirilishi mumkin, bu sizga ikkita sonni bo'lishda qoldiqni ko'rsatish imkonini beradi. Agar qoldiq 0 bo'lsa, bu birinchi raqam ikkinchisining karrali ekanligini anglatadi.

12% 5 // 2 -> 12 5 ga karrali emas
12% 3 // 0 -> 12 3 ning karrali

Shunday qilib, agar siz 12 ni 5 ga bo'lsangiz, siz 2 ga qoldiq bilan 2 ni olasiz. Agar 12 ni 3 ga bo'lsangiz, 4 qoldig'i bilan 0 ni olasiz. Birinchi holda, 12 5 ning karrali emas, ikkinchisida , 12 3 ning karrali.

qaror

Optimal yechim quyidagi kod bo'ladi:

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

Funktsiya shartli bayonotlar yordamida kerakli tekshiruvlarni amalga oshiradi va foydalanuvchi tomonidan talab qilinadigan natijani ishlab chiqaradi. Masalada if...else gaplarining tartibiga e’tibor qaratish o‘rinlidir: qo‘sh shart (&&) bilan boshlanib, bir nechta son topilmagan holat bilan yakunlanadi. Natijada, biz barcha variantlarni ko'rib chiqamiz.

Anagram

Bu boshqa so'zning barcha harflarini bir xil raqamda, lekin boshqa tartibda o'z ichiga olgan so'zning nomi.

Staging

Biz ikkita satrning anagram ekanligini tekshiradigan funktsiyani yozishimiz kerak va bu holat muhim emas. Faqat belgilar hisobga olinadi; bo'shliqlar yoki tinish belgilari hisobga olinmaydi.

anagram('topuvchi', 'Do'st') —> rost
anagram('salom', 'bay') —> noto'g'ri

Keling, vazifani tahlil qilaylik

Bu erda e'tiborga olish kerak bo'lgan muhim narsa shundaki, siz ikkita kirish qatoridagi har bir harfni va har bir satrda ularning sonini tekshirishingiz kerak.

topuvchi -> f: 1 do'st -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 kun: 1

Anagram ma'lumotlarini saqlash uchun siz JavaScript ob'ektining literali kabi tuzilmani tanlashingiz kerak. Bu holda kalit harfning xarakteri, qiymat joriy satrdagi takrorlanishlar soni.

Boshqa shartlar mavjud:

  • Taqqoslashda harflar ishi hisobga olinmasligiga ishonch hosil qilishingiz kerak. Biz shunchaki ikkala satrni kichik yoki katta harfga aylantiramiz.
  • Biz barcha bo'lmagan belgilarni taqqoslashdan chiqaramiz. Eng yaxshisi bilan ishlash muntazam iboralar.

qaror

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

Foydalanishga e'tibor bering Object.keys() yuqoridagi parchada. Bu usul nomlar yoki kalitlarni o'z ichiga olgan massivni ob'ektda paydo bo'ladigan tartibda qaytaradi. Bu holda massiv quyidagicha bo'ladi:

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

Shunday qilib, biz ommaviy tsiklni bajarmasdan ob'ektning xususiyatlarini olamiz. Muammoda ikkala satrda belgilar soni bir xil yoki yo'qligini tekshirish uchun .length xususiyati bilan ushbu usuldan foydalanishingiz mumkin - bu anagrammalarning muhim xususiyati.

Unli tovushlarni qidirish

Ko'pincha intervyularda paydo bo'ladigan juda oddiy vazifa.

Staging

Argument sifatida satrni oladigan va qatordagi unlilar sonini qaytaradigan funksiya yozishingiz kerak.
Unli tovushlar "a", "e", "i", "o", "u".

Misol:

findVowels('salom') // —> 2
findVowels('nima uchun') // —> 0

qaror

Mana eng oddiy variant:

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() usulidan foydalanishga e'tibor qaratish lozim. U satrlar va massivlar uchun mavjud. Undan massivda ma'lum bir qiymat bor yoki yo'qligini aniqlash uchun foydalanish kerak. Agar massiv belgilangan qiymatni o'z ichiga olgan bo'lsa, bu usul true qiymatini qaytaradi, agar u bo'lmasa, noto'g'ri.

Muammoning qisqaroq yechimi bor:

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

Bu samarali qidiruvni amalga oshirish imkonini beruvchi .match() usulidan foydalanadi. Agar ko'rsatilgan satr ichida usul argumenti sifatida muntazam ifoda topilsa, qaytariladigan qiymat mos keladigan belgilar massividir. Agar mos keladiganlar bo'lmasa, .match() nullni qaytaradi.

fibonachchi

Turli darajadagi intervyularda topilishi mumkin bo'lgan klassik vazifa. Shuni esda tutish kerakki, Fibonachchi ketma-ketligi har bir keyingi oldingi ikkitasining yig'indisi bo'lgan raqamlar qatoridir. Shunday qilib, birinchi o'nta raqam quyidagicha ko'rinadi: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Staging

n-chi yozuvni ma'lum ketma-ketlikda qaytaradigan funksiya yozishingiz kerak, bunda n - funksiyaga argument sifatida uzatiladigan raqam.

fibonachchi (3) // —> 2

Bu vazifa argumentda ko'rsatilgan necha marta tsikl bo'ylab yurishni, qiymatni tegishli pozitsiyaga qaytarishni o'z ichiga oladi. Muammoni qo'yishning bu usuli halqalardan foydalanishni talab qiladi. Agar siz uning o'rniga rekursiyadan foydalansangiz, u suhbatdoshni xursand qilishi va sizga bir nechta qo'shimcha fikrlarni berishi mumkin.

qaror

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

Natijalar qatorida birinchi ikkita raqam ketma-ketlikda joylashgan, chunki ketma-ketlikdagi har bir yozuv oldingi ikkita raqamning yig'indisidir. Eng boshida keyingi raqamni olish uchun olinadigan ikkita raqam yo'q, shuning uchun tsikl ularni avtomatik ravishda yarata olmaydi. Lekin, biz bilganimizdek, birinchi ikkita raqam har doim 0 va 1. Shuning uchun natijalar qatorini qo'lda ishga tushirishingiz mumkin.

Rekursiyaga kelsak, hamma narsa bir vaqtning o'zida oddiyroq va murakkabroq:

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

Biz fibonachchi() ni chaqirishda davom etamiz, kichikroq va kichikroq raqamlarni argument sifatida uzatamiz. O'tkazilgan argument 0 yoki 1 bo'lganda biz to'xtab qolamiz.

xulosa

Agar siz frontend yoki JavaScript-ni ishlab chiquvchi ishi bo'yicha suhbatdan o'tgan bo'lsangiz (ayniqsa, u kichik darajadagi bo'lsa) bu vazifalarning birortasiga duch kelgan bo'lishingiz mumkin. Ammo agar siz ularni uchratmagan bo'lsangiz, ular kelajakda foydali bo'lishi mumkin - hech bo'lmaganda umumiy rivojlanish uchun.

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish