5 tipik JavaScript röportaj görevi: analiz ve çözümler

5 tipik JavaScript röportaj görevi: analiz ve çözümler

Tercümandan: sizin için bir makale yayınladım Yaygın JavaScript görevlerinden bahseden Maria Antonietta Perna, çoğunlukla görüşmeler sırasında geliştirici adaylarına sunulur. Makale her şeyden önce acemi programcılar için faydalı olacaktır.

Teknoloji şirketlerindeki röportajlar uzun zamandır kasabanın konuşulan konusu oldu. Bu şaşırtıcı olmamalı; bir röportajı başarıyla geçmek size iyi bir iş bulma fırsatı verir. Ancak bu o kadar basit değil çünkü karmaşık sorunların çoğu zaman çözülmesi gerekiyor.

Üstelik çoğu zaman bu görevlerin çoğu, başvuru sahibinin yapacağı işle ilgili değildir, ancak yine de çözülmesi gerekir. Bazen bunu Google'a veya başka bir kaynağa danışmadan tahtada yapmanız gerekir. Evet, durum giderek değişiyor ve bazı şirketler bu tür görüşmeleri terk ediyor ancak birçok işveren hâlâ bu geleneğe bağlı kalıyor. Bu makale, iş arayanlar için sıklıkla görev olarak kullanılan tipik JavaScript görevlerinin analizine ayrılmıştır.

Hatırlatıyoruz: tüm "Habr" okuyucuları için - "Habr" promosyon kodunu kullanarak herhangi bir Skillbox kursuna kayıt olurken 10 ruble indirim.

Skillbox şunları önerir: pratik kurs "Mobil Geliştirici PRO".

Önemli olan röportajınıza iyice hazırlanmaktır.

Evet, görevlere bakmaya başlamadan önce bazı genel mülakat hazırlığı ipuçlarına bakalım.

Önemli olan önceden hazırlık yapmaktır. Algoritma ve veri yapılarını ne kadar iyi hatırladığınızı test edin ve fazla aşina olmadığınız alanlarda bilginizi geliştirin. Mülakatlara hazırlanmanıza yardımcı olabilecek birçok çevrimiçi platform var. Tavsiye ediyoruz geeksforgeeks, bebek arabası, Görüşme.io и Kod Sinyali.

Kararı yüksek sesle söylemeyi öğrenmeye değer. Başvuru sahiplerine ne yaptığınızı anlatmanız ve sadece tahtaya yazmanız (veya bilgisayara sessizce kod yazmanız) tavsiye edilir. Bu sayede kodda hata yaparsanız ancak çözüm genel olarak doğruysa başarı şansınızı artırabilirsiniz.

Sorunu çözmeye başlamadan önce onu anlamalısınız. Bazı durumlarda, bir görevi yüzeysel olarak anlayabilir ve daha sonra yanlış yola düşebilirsiniz. Görüşmeciye birkaç açıklayıcı soru sormak faydalı olabilir.

PC'de değil, elle kod yazma pratiği yapmanız gerekir. Mülakatlar sırasında başvuru sahibine hiçbir ipucu veya otomatik biçimlendirmenin olmadığı bir işaretleyici ve beyaz tahta verilir. Çözüm ararken kodunuzu bir parça kağıda veya doğrudan tahtaya yazmanız faydalı olacaktır. Her şeyi aklınızda tutarsanız önemli bir şeyi unutabilirsiniz.

JavaScript'te şablon görevleri

Bu görevlerden bazıları muhtemelen size zaten tanıdık geliyor. Ya benzer bir şeyi çözmeniz gereken röportajlar yaptınız ya da JavaScript öğrenirken bunlar üzerinde pratik yaptınız. Şimdi bunları tekrar çözmenin ve sürecin ayrıntılı bir açıklamasını yapmanın zamanı geldi.

Palindrom

Palindrom, hem normal yönde hem de ters yönde tamamen aynı şekilde okunan bir kelime, cümle veya karakter dizisidir. Örneğin, "Anna" bir palindromdur ancak "masa" ve "John" değildir.

üretim

Bir dize verildiğinde; dize bir palindrom ise true, değilse false değerini döndürmenize olanak tanıyan bir işlev yazmanız gerekir. Bu durumda boşlukları ve noktalama işaretlerini dikkate almanız gerekir.

palindrom('yarış arabası') === doğru
palindrom('tablo') === yanlış

Görevi analiz edelim

Buradaki ana fikir dizeyi tersine çevirmektir. Eğer "ters" dize orijinal dizeyle tamamen aynıysa, o zaman bir palindrom almış oluruz ve işlev true değerini döndürmelidir. Değilse, yanlış.

karar

İşte palindromu çözen 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('')
}

İlk adım, giriş dizesindeki karakterleri küçük harfe dönüştürmektir. Bu, programın büyük/küçük harf veya başka bir şeyi değil, karakterleri kendileri karşılaştıracağının garantisidir.

İkinci adım çizgiyi tersine çevirmektir. Bunu yapmak zor değil: .split() yöntemini (String kitaplığı) kullanarak onu bir diziye dönüştürmeniz gerekir. Daha sonra .reverse() (Array kütüphanesi) kullanarak diziyi tersine çeviririz. Son adım, ters diziyi .join() (Dizi kitaplığı) kullanarak bir dizeye dönüştürmektir.

Şimdi yapmanız gereken tek şey "ters" dizeyi orijinal dizeyle karşılaştırmak ve sonucu doğru veya yanlış olarak döndürmek.

FizzBuzz

Röportajlarda en popüler görevlerden biri.

üretim

Konsola 1'den n'ye kadar sayıları yazdıran bir fonksiyon yazmanız gerekir; burada n, fonksiyonun parametre olarak aldığı bir tam sayıdır ve aşağıdaki koşullarla:

  • 3'ün katları yerine fizz çıktısı alın;
  • 5'in katları olan sayılar yerine vızıltı çıkışı;
  • Hem 3'ün hem de 5'in katı olan sayılar yerine fizzbuzz çıktısı.

Örnek

Fizzbuzz(5)

sonuç

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

Görevi analiz edelim

Buradaki en önemli şey, JavaScript kullanarak katları bulmanın bir yoludur. İki sayıyı bölerken kalanı göstermenize olanak tanıyan modül operatörü veya kalan - % kullanılarak uygulanabilir. Kalanın 0 olması birinci sayının ikincinin katı olduğu anlamına gelir.

%12 5 // 2 -> 12, 5'in katı değil
%12 3 // 0 -> 12, 3'ün katıdır

Yani 12'yi 5'e bölerseniz 2 ve kalan 2 elde edersiniz. 12'yi 3'e bölerseniz 4 ve kalan 0 olur. İlk durumda 12, 5'in katı değildir, ikinci durumda ise 12, 3'in katı değildir. XNUMX XNUMX'ün katıdır.

karar

En uygun çözüm aşağıdaki kod olacaktır:

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

Fonksiyon, koşullu ifadeleri kullanarak gerekli kontrolleri gerçekleştirir ve kullanıcının istediği sonucu üretir. Problemde if...else ifadelerinin sırasına dikkat etmek önemlidir: çift koşulla (&&) başlayın ve birden fazla sayının bulunamadığı durumla bitirin. Sonuç olarak tüm seçenekleri ele alıyoruz.

Anagram

Bu, başka bir kelimenin tüm harflerini aynı sayıda ancak farklı sırada içeren bir kelimenin adıdır.

üretim

İki dizenin anagram olup olmadığını kontrol eden bir fonksiyon yazmamız gerekiyor ve büyük/küçük harf önemli değil. Yalnızca karakterler sayılır; boşluklar veya noktalama işaretleri dikkate alınmaz.

anagram('bulucu', 'Arkadaş') —> true
anagram('merhaba', 'güle güle') —> false

Görevi analiz edelim

Burada dikkat edilmesi gereken önemli nokta, iki giriş satırındaki her harfi ve her satırdaki sayısını kontrol etmeniz gerektiğidir.

bulucu —> f: 1 arkadaş —> f: 1
ben: 1 r: 1
n: 1 ben: 1
g: 1 e: 1
e: 1 n: 1
r: 1 gün: 1

Anagram verilerini depolamak için JavaScript nesne değişmezi gibi bir yapı seçmelisiniz. Bu durumda anahtar, mektubun karakteridir, değer ise geçerli satırdaki tekrarlarının sayısıdır.

Başka koşullar da var:

  • Karşılaştırma yaparken harflerin büyüklüğünün dikkate alınmadığından emin olmanız gerekir. Her iki dizeyi de küçük veya büyük harfe dönüştürüyoruz.
  • Karakter olmayanların tamamını karşılaştırmanın dışında tutuyoruz. Birlikte çalışmak en iyisi düzenli ifadeler.

karar

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

Kullanıma dikkat edin Object.keys () yukarıdaki parçada. Bu yöntem, adları veya anahtarları nesnede göründükleri sırayla içeren bir dizi döndürür. Bu durumda dizi şu şekilde olacaktır:

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

Bu şekilde toplu döngü yapmaya gerek kalmadan nesnenin özelliklerini elde ederiz. Bir problemde, her iki dizenin de aynı sayıda karaktere sahip olup olmadığını kontrol etmek için bu yöntemi .length özelliğiyle birlikte kullanabilirsiniz; bu, anagramların önemli bir özelliğidir.

Sesli harfleri ara

Röportajlarda sıklıkla ortaya çıkan oldukça basit bir görev.

üretim

Argüman olarak bir dizeyi alan ve dizede bulunan sesli harf sayısını döndüren bir fonksiyon yazmanız gerekir.
Sesli harfler “a”, “e”, “i”, “o”, “u”dur.

Örnek:

findVowels('merhaba') // —> 2
findVowels('neden') // —> 0

karar

İşte en basit seçenek:

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() yönteminin kullanımına dikkat etmek önemlidir. Hem dizeler hem de diziler için kullanılabilir. Bir dizinin belirli bir değer içerip içermediğini belirlemek için kullanılmalıdır. Bu yöntem, dizi belirtilen değeri içeriyorsa true değerini, içermiyorsa false değerini döndürür.

Sorunun daha kısa bir çözümü var:

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

Bu, etkili bir arama uygulamanıza olanak tanıyan .match() yöntemini kullanır. Belirtilen dize içinde yöntem bağımsız değişkeni olarak normal bir ifade bulunursa, dönüş değeri eşleşen karakterlerden oluşan bir dizidir. Eğer eşleşme yoksa .match() işlevi null değerini döndürür.

Fibonacci

Çeşitli düzeylerdeki röportajlarda bulunabilecek klasik bir görev. Fibonacci dizisinin, birbirini izleyen her sayının önceki ikisinin toplamı olduğu bir sayı dizisi olduğunu hatırlamakta fayda var. Yani ilk on sayı şu şekilde görünür: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

üretim

N'inci kaydı belirli bir sırayla döndüren bir fonksiyon yazmanız gerekir; n, fonksiyona argüman olarak iletilen sayıdır.

fibonacci(3) // —> 2

Bu görev, argümanda belirtilen sayıda döngüde dolaşmayı ve değeri uygun konuma döndürmeyi içerir. Sorunu bu şekilde ortaya koymanın yolu döngülerin kullanımını gerektirir. Bunun yerine özyinelemeyi kullanırsanız, görüşmeciyi memnun edebilir ve size ekstra birkaç puan kazandırabilir.

karar

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

Sonuçlar dizisinde ilk iki sayı serinin içinde yer alır çünkü dizideki her giriş önceki iki sayının toplamıdır. Başlangıçta bir sonraki sayıyı elde etmek için alınabilecek iki sayı yoktur, dolayısıyla döngü bunları otomatik olarak oluşturamaz. Ancak bildiğimiz gibi ilk iki sayı her zaman 0 ve 1'dir. Bu nedenle sonuçlar dizisini manuel olarak başlatabilirsiniz.

Özyinelemeye gelince, her şey aynı anda daha basit ve daha karmaşıktır:

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

Argüman olarak gittikçe küçülen sayıları aktararak fibonacci()'yi çağırmaya devam ediyoruz. Geçirilen argüman 0 veya 1 olduğunda dururuz.

Aviator apk

Bir ön uç veya JavaScript geliştirici işi için görüşme yaptıysanız (özellikle de alt düzeydeyse), büyük olasılıkla bu görevlerden herhangi biriyle zaten karşılaşmışsınızdır. Ancak bunlarla karşılaşmadıysanız, gelecekte en azından genel gelişim açısından faydalı olabilirler.

Skillbox şunları önerir:

Kaynak: habr.com

Yorum ekle