27.05.2024

Javascript, Beylik Mülakat Soruları 1

 İş görüşmesi sırasında çok sık sorulan bazı küçük problemler var. Bir kere çözünce bu muymuş dedirten basitlikte olan bu sorular, özellikle stres de yapılmışsa başa dert olabilir. İnternette aradığınızda ya da bir online eğitim aldığınızda bu sorularla mutlaka karşılaşırsınız. Düşünürseniz çözümünü bulmanız işten bile olmayan bu sorulardan bazılarına aşağıda değinmek istiyorum. Hem pratik yapmış oluruz hem de belli mi olur karşınıza çıkarsa o saniyede çözüverirsiniz. :)

Öncelikle şunu da söyleyelim ki internet trolleri üşüşmesin (Okuyan da yok aslında. 2 senedir yazı yazmamışım :D) Burada vereceğim çözümler ne tek çözüm ne de en iyi çözümdür. Sadece bir çözümdür. 

Soru: Verilen metni ters çeviren bir fonksiyon yazınız ya da verilen string'in karakterlerini tersten sıralayınız.

Tek satırlık basit bir çözüm var. Önce kodu verelim sonra aşağıda açıklayalım.

return str.split('').reverse().join('');

Verilen string, str değişkeninde olsun.:

  • String'in split metoduna boş bir string'i (boşluk karakteri içeren bir string'i değil.) parametre geçerek her bir karakterin ayrı bir eleman olduğu bir array oluşturuyoruz. 
  • Oluşturduğumuz array üzerinde reverse metodunu kullanarak array'in elmanlarının sırasını tersine çeviriyoruz.
  • Array'in join metoduna yine boş bir string'i parametre olarak geçerek array elemanlarını birleştirip yeni bir string oluşturuyoruz.
Methodları chain etmek okumanızı zorlaştırıyorsa çözümü aşağıdaki şekilde de düşünebilirsiniz.

const arr = str.split('');
const reversedArray = arr.reverse();
const reversedString = reversedArray.join('');
return reversedString;

Soru: Verilen String'de en çok kullanılan karakter hangisidir?

Bu sorunun çözümü için öncelikle bir character map oluşturmak işimizi kolaylaştırır. Hatta bunu bir obje olarak yapalım da, daha da kolay olsun. Siz isterseniz Map ile de yapabilirsiniz.

const charMap = {};

for(let char of str){
    charMap[char] = charMap[char] + 1 || 1;
}

  • for ... of  döngüsünü kullanarak verilen string'in karakterlerini tek tek alalım. 
  • Döngünün her iterasyonunda charMap objesinin o döngüdeki char değerini 1 arttıralım ya da henüz bu char değeri obje'nin key'leri arasında yer almıyorsa değerini 1'e eşitleyelim. 
  • charMap bu işlemin sonunda "Hello there!" string'i için aşağıdaki gibi görselleştirilebilir.


Şimdi bu charMap obje'sini kullanarak soruda istenen sonuca ulaşabiliriz.

let max = 0;
let maxChar = '';

for(let char in charMap){
    if(charMap[char] > max) {
        max = charMap[char];
        maxChar = char;
    }
}

  • Az sonra kullanacağımız döngü içerisinde karşılaştığımız en çok kullanılan char'ın değerini tutmak için max bu char'ın hangi karakter olduğunu tutmak için ise maxChar değişkenlerini tanımlayalım. 
  • for ... in  döngüsünü kullanarak charMap'in keylerini tek tek dönelim. 
  • Her iterasyonda karşımıza çıkan key'in (char) değeri şu ana kadar gördüğümüz değerlerden (max) büyük mü değil mi kontrol ederek en çok kullanılan char'ı bulalım.
Tam çözüm aşağıdaki gibi:

const charMap = {};
let max = 0;
let maxChar = '';

for(let char of str){
    charMap[char] = charMap[char] + 1 || 1;
}

for(let char in charMap){
    if(charMap[char] > max) {
        max = charMap[char];
        maxChar = char;
    }
}

return maxChar;

Soru: 1'den verilen sayıya kadar olan sayıları (verilen sayı dahil) ekrana yazdırınız. Sayı 3'e bölünüyorsa sayı yerine 'fizz', 5'e bölünüyorsa 'buzz', hem 3'e hem 5'e bölünüyorsa 'fizzbuzz' yazdırınız.

'fizzbuzz' adıyla anılan bu sorunun çözümü sizin de tahmin ettiğiniz gibi çok kolay. Görelim:

for(let i = 1; i<n; i++){
    let fizzbuzz = '';
    
    if (i % 3 === 0) fizzbuzz += 'fizz';
    if (i % 5 === 0) fizzbuzz += 'buzz';

    if(fizzbuzz !== '') {
        console.log(fizzbuzz);
    } else{
        console.log(i);
    }
}

Gördüğünüz gibi soruyu çözmek için matematikteki mod alma konusunu ve javascript'deki mod (modulus) operatörünü ( % ) hatırlamak yeterli. Adım adım inceleyelim.

  • Birden istenen sınır sayıya kadar (n) dönecek olan bir döngü oluşturuyoruz.
  • Ekrana yazacağımız string'i belirlemek için fizzbuzz değişkenini oluşturup değerini boş string olarak atıyoruz.
  • Her iterasyon için sıradaki değerin üçe bölünüp bölünmediğini i%3 === 0 ifadesi ile i'nin üçe bölümünden kalanın sıfıra eşit olup olmadığını kontrol ederek belirliyoruz. i üçe bölünüyorsa fizzbuzz değişkenine 'fizz' stringini ekliyoruz. Burada değişkeni fizz'e de eşitleyebiliriz.
  • Bir üst maddedekine benzer şekilde i'nin beşe bölünüp bölünmediğini kontrol ederek bölünüyorsa 'buzz' değerini fizzbuzz değişkenine ekliyoruz.
  • fizzbuzz değişkeninin değerinin boş olup olmadığını kontrol ederek ekrana ne yazdıracağımıza karar veriyoruz.
Bu yazı için bu kadar yeter sanırım. Eğer üşenmezsem blog'a daha fazla yazı yazmak niyetindeyim. :)