5 Ümumi JavaScript Müsahibə Problemləri: Təhlil və Həll yolları

5 Ümumi JavaScript Müsahibə Problemləri: Təhlil və Həll yolları

Tərcüməçidən: sizin üçün bir məqalə dərc etdi Tipik JavaScript tapşırıqları haqqında danışan Maria Antonietta Perna, ən çox müsahibələrdə ərizəçi-inkişafçılara təklif olunur. Məqalə, ilk növbədə, təcrübəsiz proqramçılar üçün faydalı olacaqdır.

Texnologiya şirkətlərində müsahibələr uzun müddətdir ki, şəhərin müzakirə mövzusudur. Bu təəccüblü deyil - müsahibənin uğurla başa çatması yaxşı bir iş əldə etməyə imkan verir. Ancaq bu o qədər də asan deyil, çünki çox vaxt mürəkkəb problemləri həll etmək lazımdır.

Üstəlik, əksər hallarda bu vəzifələrin əksəriyyəti ərizəçinin yerinə yetirəcəyi işlə əlaqəli deyil, lakin hələ də həll edilməlidir. Bəzən Google və ya başqa mənbə ilə yoxlamadan bunu lövhədə etməli olursunuz. Bəli, vəziyyət tədricən dəyişir və bəzi şirkətlərdə belə müsahibələrdən imtina edirlər, lakin bir çox işəgötürən hələ də bu ənənəyə sadiq qalır. Bu məqalə tez-tez ərizəçilər üçün tapşırıq kimi istifadə olunan tipik JavaScript tapşırıqlarının təhlilinə həsr edilmişdir.

Xatırladırıq: "Habr" ın bütün oxucuları üçün - "Habr" promosyon kodundan istifadə edərək hər hansı bir Skillbox kursuna yazılarkən 10 000 rubl endirim.

Skillbox tövsiyə edir: Praktik kurs "Mobil Developer PRO".

Əsas odur ki, müsahibəyə diqqətlə hazır olun.

Bəli, tapşırıqları bölməyə başlamazdan əvvəl müsahibəyə hazırlaşmaq üçün bəzi ümumi məsləhətlərə nəzər salaq.

Əsas odur ki, əvvəlcədən hazırlayın. Alqoritmləri və məlumat strukturlarını nə dərəcədə yaxşı xatırladığınızı yoxlayın və çox da tanış olmadığınız sahələrdə biliklərinizi təkmilləşdirin. Müsahibələrə hazırlaşmağınıza kömək edəcək bir çox onlayn platformalar var. məsləhət görürük geeksforgeeks, Pramp, Interviewing.io и Code Signal.

Qərarı yüksək səslə tələffüz etməyi öyrənməyə dəyər. Abituriyentlərə nə etdiyinizi söyləmək məsləhətdir və sadəcə lövhəyə yazmaq deyil (yaxud kompüterdə kodu da səssizcə yazın). Beləliklə, kodda səhv etsəniz, lakin həlli ümumiyyətlə düzgündürsə, uğur şansınızı artıra bilərsiniz.

Problemi həll etməyə başlamazdan əvvəl başa düşmək lazımdır. Bəzi hallarda, tapşırığı səthi şəkildə başa düşə və sonra yanlış yola gedə bilərsiniz. Müsahibəyə bir neçə aydınlaşdırıcı sual verməyə dəyər ola bilər.

Siz kompüterdə deyil, əl ilə kod yazmağı məşq etməlisiniz. Belə olur ki, müsahibə zamanı ərizəçiyə heç bir göstəriş və ya avtomatik formatlaşdırma olmayan marker və lövhə verilir. Həll yolu axtararkən kodunuzu bir kağız parçasına və ya düz lövhəyə yazın. Hər şeyi beyninizdə saxlasanız, vacib bir şeyi unuda bilərsiniz.

JavaScript-də Şablon Tapşırıqları

Yəqin ki, bu tapşırıqların bəziləri ilə artıq tanışsınız. Ya oxşar bir şeyi həll etməli olduğunuz müsahibələr götürdünüz, ya da JavaScript-i öyrənərkən təcrübə etdiniz. Yaxşı, indi onları yenidən və prosesin ətraflı izahı ilə həll etməyin vaxtı gəldi.

Palindrom

Palindrom həm adi istiqamətdə, həm də əks istiqamətdə tam eyni şəkildə oxunan söz, cümlə və ya simvol ardıcıllığıdır. Məsələn, "Anna" palindromdur, lakin "masa" və "John" deyil.

Səhnələşdirmə

Bir simli verilir; əgər sətir palindromdursa doğru, əks halda isə false qaytarmağa imkan verən funksiya yazmalısınız. Bu zaman boşluqlar və durğu işarələri nəzərə alınmalıdır.

palindrom('yarış arabası') === doğrudur
palindrom('cədvəl') === yanlış

Tapşırığın təhlili

Burada əsas fikir simi arxaya çevirməkdir. Əgər "əks" sətir orijinalla tamamilə eynidirsə, onda biz palindrom aldıq və funksiya doğru qayıtmalıdır. Yoxdursa, yalan.

qərar

Palindromu həll etməyə imkan verən kod budur.

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

İlk addım daxil edilmiş sətir simvollarını kiçik hərflərə çevirməkdir. Bu, proqramın tam olaraq personajların özlərini müqayisə edəcəyinə zəmanətdir, hadisə və ya başqa bir şey deyil.

İkinci addım xəttin tərsidir. Bunu etmək asandır: siz onu .split() metodundan (String kitabxanası) istifadə edərək massivə çevirməlisiniz. Sonra .reverse() (Array kitabxanası) istifadə edərək massivi tərsinə çeviririk. Son addım .join() (Array kitabxanası) istifadə edərək əks massivi sətirə çevirməkdir.

İndi lazım olan tək şey "əks" sətri orijinalla müqayisə etmək, nəticəni doğru və ya yanlış qaytarmaqdır.

fizzbuzz

Ən məşhur iş müsahibələrindən biri.

Səhnələşdirmə

Konsola 1-dən n-ə qədər rəqəmləri göstərən funksiyanın yazılması tələb olunur, burada n funksiyanın parametr kimi qəbul etdiyi tam ədəddir, aşağıdakı şərtlərlə:

  • 3-ün qatlarının yerinə fizz çıxışı;
  • 5-in qatlarının əvəzinə buzz çıxışı;
  • həm 3, həm də 5-in qatlarının yerinə fizzbuzz çıxışı.

Misal

Fizzbuzz(5)

Nəticə

/ / 1
/ / 2
// fizz
/ / 4
// vızıltı

Tapşırığın təhlili

Burada əsas şey JavaScript-dən istifadə edərək çoxluqları tapmaq yoludur. O, modul operatorundan və ya qalan -% -dən istifadə etməklə həyata keçirilə bilər ki, bu da iki ədədi bölərkən qalanı göstərməyə imkan verir. Qalan 0 olarsa, bu o deməkdir ki, birinci ədəd ikincinin qatıdır.

12% 5 // 2 -> 12 5-ə qat deyil
12% 3 // 0 -> 12 3-ə çoxluqdur

Deməli, 12-ni 5-ə bölsək, 2-nin qalığı ilə 2-ni alırıq. 12-ni 3-ə bölsək, 4-a qalanı ilə 0-ü alarıq. Birinci halda, 12, 5-in qatı deyil. ikincisi, 12 3-ün qatıdır.

qərar

Ən yaxşı həll aşağıdakı kod olardı:

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

Funksiya şərti ifadələrdən istifadə edərək lazımi yoxlamaları həyata keçirir və istifadəçinin tələb etdiyi nəticəni verir. Tapşırıqda if...else ifadələrinin sırasına diqqət yetirməyə dəyər: qoşa şərtlə (&&) başlayaraq və çoxsaylı ədədlərin tapılmadığı halla bitir. Nəticədə bütün variantları əhatə edirik.

Anaqram

Bu, başqa bir sözün bütün hərflərini eyni sayda, lakin fərqli ardıcıllıqla ehtiva edən bir sözün adıdır.

Səhnələşdirmə

Biz iki sətirin anaqram olub-olmadığını yoxlayan funksiya yazmalıyıq və hərflərin böyüklüyünün əhəmiyyəti yoxdur. Yalnız simvollar sayılır; boşluqlar və durğu işarələri nəzərə alınmır.

anagram('tapıcı', 'Dost') -> doğru
anaqram('salam', 'bye') -> yalan

Tapşırığın təhlili

Burada nəzərə almaq vacibdir ki, hər bir hərfi iki giriş sətirində və hər sətirdə onların sayını yoxlamaq lazımdır.

axtaran -> f: 1 dost -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 gün: 1

Anaqram məlumatlarını saxlamaq üçün JavaScript obyekti hərfi kimi struktur seçməlisiniz. Bu vəziyyətdə əsas hərfin xarakteridir, dəyər cari sətirdəki təkrarların sayıdır.

Digər şərtlər də var:

  • Müqayisə edərkən hərflərin halının nəzərə alınmadığından əmin olmalısınız. Sadəcə hər iki sətri kiçik və ya böyük hərflərə çevirin.
  • Bütün qeyri-simvolları müqayisədən çıxarırıq. Ən yaxşısı ilə işləmək müntəzəm ifadələr.

qərar

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

İstifadəsinə diqqət yetirin Object.keys() yuxarıdakı fraqmentdə. Bu üsul adları və ya açarları obyektdə göründükləri ardıcıllıqla ehtiva edən massivi qaytarır. Bu halda massiv belə olacaq:

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

Beləliklə, biz böyük bir döngə etmədən obyektin xüsusiyyətlərini əldə edirik. Tapşırıqda siz .length xassəsi ilə bu üsuldan istifadə edə bilərsiniz - hər iki sətirdə eyni sayda simvol olub-olmadığını yoxlamaq üçün - bu, anaqramların mühüm xüsusiyyətidir.

Sait axtarışı

Müsahibələrdə tez-tez rast gəlinən olduqca sadə bir iş.

Səhnələşdirmə

Arqument kimi sətir götürən və sətirdə olan saitlərin sayını qaytaran funksiya yazmalısınız.
Saitlər "a", "e", "i", "o", "u"dur.

Misal:

findVowels('salam') // --> 2
findVowels('niyə') // --> 0

qərar

Budur ən asan seçim:

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() metodunun istifadəsinə diqqət yetirmək vacibdir. Həm sətirlər, həm də massivlər üçün mövcuddur. Massivin müəyyən bir dəyərin olub olmadığını öyrənmək üçün istifadə edilməlidir. Bu metod massivdə müəyyən edilmiş dəyər varsa doğru, əks halda isə yalan qaytarır.

Problemin daha qısa bir həlli də var:

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

Burada səmərəli axtarışı həyata keçirməyə imkan verən .match() metodundan istifadə olunur. Metod arqumenti kimi müntəzəm ifadə müəyyən edilmiş sətirdə tapılarsa, qaytarılan dəyər uyğun gələn simvollar massividir. Yaxşı, heç bir uyğunluq yoxdursa, .match() null qaytarır.

Fibonacci

Müxtəlif səviyyəli müsahibələrdə qarşılana bilən klassik tapşırıq. Fibonacci ardıcıllığının hər bir sonrakının əvvəlki ikisinin cəmi olduğu bir sıra nömrələr olduğunu xatırlamaq lazımdır. Beləliklə, ilk on rəqəm belə görünür: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Səhnələşdirmə

Müəyyən ardıcıllıqla n-ci qeydi qaytaran funksiya yazmalısınız və n funksiyaya arqument kimi ötürülən ədəddir.

fibonacci(3) // --> 2

Bu tapşırığa arqumentdə göstərilən dəfələrin dövrə vurması, dəyəri müvafiq mövqeyə qaytarılması daxildir. Problemi həll etməyin bu yolu döngələrin istifadəsini tələb edir. Əvəzində rekursiyadan istifadə etsəniz, müsahibə verənin xoşuna gələ və sizə bir neçə əlavə xal verə bilər.

qərar

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

Nəticə massivində ilk iki ədəd bir cərgədə yerləşir, çünki ardıcıllıqdakı hər bir giriş əvvəlki iki ədədin cəmindən ibarətdir. Başlanğıcda növbəti nömrəni almaq üçün götürülə bilən iki ədəd yoxdur, ona görə də dövrə onları avtomatik olaraq yarada bilməz. Ancaq bildiyimiz kimi, ilk iki rəqəm həmişə 0 və 1-dir. Buna görə də, nəticə massivini əl ilə başlata bilərsiniz.

Rekursiyaya gəldikdə, hər şey daha sadə və eyni zamanda daha mürəkkəbdir:

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() çağırmağa davam edirik, arqumentlər olaraq daha kiçik və daha kiçik rəqəmləri ötürürük. Keçirilmiş arqument 0 və ya 1 olduqda dayanırıq.

Buraxılış

Çox güman ki, siz frontend və ya JavaScript inkişaf etdiricisi kimi bir iş üçün müsahibə vermisinizsə (xüsusilə bu kiçik səviyyədirsə) bu vəzifələrdən hər hansı biri ilə qarşılaşmısınız. Ancaq onlarla qarşılaşmamısınızsa, gələcəkdə faydalı ola bilər - heç olmasa ümumi inkişaf üçün.

Skillbox tövsiyə edir:

Mənbə: www.habr.com

Добавить комментарий