5 tipikus JavaScript interjúfeladat: elemzés és megoldások

5 tipikus JavaScript interjúfeladat: elemzés és megoldások

A fordítótól: megjelent egy cikket az Ön számára Maria Antonietta Perna, aki a gyakori JavaScript-feladatokról beszél, leggyakrabban interjúk során kínálják fel a fejlesztő pályázóknak. A cikk elsősorban a kezdő programozók számára lesz hasznos.

A technológiai cégeknél készített interjúk már régóta szóba kerültek a városban. Ez nem lehet meglepő – az interjú sikeres letétele lehetőséget ad arra, hogy jó állást kapjon. De ez nem olyan egyszerű, mivel gyakran összetett problémákat kell megoldani.

Ezen túlmenően a legtöbb ilyen feladat nem kapcsolódik a pályázó által elvégzendő munkához, de még meg kell oldani. Néha meg kell tennie a táblán, anélkül, hogy a Google-tól vagy bármely más forrástól ellenőrizné. Igen, a helyzet fokozatosan változik, és néhány cég felhagy az ilyen interjúkkal, de sok munkáltató továbbra is ragaszkodik ehhez a hagyományhoz. Ez a cikk a tipikus JavaScript-feladatok elemzésével foglalkozik, amelyeket gyakran használnak álláskeresők feladataiként.

Emlékeztetünk: a "Habr" minden olvasója számára - 10 000 rubel kedvezmény, ha a "Habr" promóciós kóddal bármely Skillbox tanfolyamra jelentkezik.

A Skillbox a következőket ajánlja: Gyakorlati tanfolyam "Mobile Developer PRO".

A legfontosabb az, hogy alaposan felkészüljenek az interjúra.

Igen, mielőtt elkezdenénk nézegetni a feladatokat, nézzünk meg néhány általános interjúkészítési tippet.

A lényeg az, hogy előre felkészüljünk. Tesztelje, mennyire emlékszik az algoritmusokra és az adatstruktúrákra, és javítsa tudását azokon a területeken, amelyeket nem ismer túl. Számos online platform segít felkészülni az interjúkra. tanácsot adunk geeksforgeek, Pramp, Interjú.io и CodeSignal.

Érdemes megtanulni hangosan kimondani a döntést. Célszerű a pályázóknak elmondani, hogy mit csinálsz, és nem csak a táblára írni (vagy beírni a kódot a számítógépbe, hangtalanul is). Így, ha hibázik a kód, de a megoldás általában helyes, növelheti a siker esélyét.

Meg kell értenie a problémát, mielőtt elkezdi megoldani. Egyes esetekben előfordulhat, hogy felületesen megért egy feladatot, majd rossz úton halad. Érdemes lehet néhány tisztázó kérdést feltenni a kérdezőnek.

A kódírást kézzel kell gyakorolni, nem PC-n. Előfordul, hogy az interjúk során a jelentkező kap egy markert és egy táblát, ahol nincs utalás vagy automatikus formázás. Ha megoldást keresünk, érdemes egy papírra vagy közvetlenül a táblára felírni a kódunkat. Ha mindent a fejedben tartasz, elfelejthetsz valami fontosat.

Sablonfeladatok JavaScriptben

Ezek közül a feladatok közül néhány valószínűleg már ismerős számodra. Volt már interjúd, ahol valami hasonlót kellett megoldanod, vagy gyakoroltál ezeken a JavaScript tanulása közben. Nos, itt az ideje, hogy újra megoldjuk őket, a folyamat részletes magyarázatával.

Palindrom

A palindrom egy szó, mondat vagy karaktersorozat, amelyet a szokásos irányban és az ellenkező irányban is pontosan ugyanúgy olvasunk. Például az „Anna” egy palindrom, de az „asztal” és a „János” nem.

staging

Adott egy karakterlánc; írnod ​​kell egy függvényt, amely lehetővé teszi, hogy igazat adj vissza, ha a karakterlánc palindrom, és false-t, ha nem. Ebben az esetben figyelembe kell vennie a szóközöket és az írásjeleket.

palindrom('versenyautó') === igaz
palindrom('tábla') === false

Elemezzük a feladatot

A fő ötlet itt a húr megfordítása. Ha a „fordított” karakterlánc teljesen megegyezik az eredetivel, akkor palindromot kaptunk, és a függvénynek true értéket kell visszaadnia. Ha nem, hamis.

döntés

Itt van a kód, amely megoldja a palindromot.

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

Az első lépés a bemeneti karakterlánc karaktereinek kisbetűssé alakítása. Ez garancia arra, hogy a program magát a karaktereket fogja összehasonlítani, nem pedig a kisbetűket vagy bármi mást.

A második lépés a vonal megfordítása. Ezt nem nehéz megtenni: tömbbé kell konvertálni a .split() metódussal (String könyvtár). Ezután megfordítjuk a tömböt a .reverse() (Tömbkönyvtár) segítségével. Az utolsó lépés a fordított tömb sztringgé alakítása a .join() (tömbkönyvtár) használatával.

Most már csak annyit kell tennie, hogy összehasonlítja a „fordított” karakterláncot az eredeti karakterlánccal, és az eredményt igaz vagy hamis visszaadja.

FizzBuzz

Az egyik legnépszerűbb feladat az interjúkban.

staging

Írnia kell egy függvényt, amely 1-től n-ig számokat ír ki a konzolra, ahol n egy egész szám, amelyet a függvény paraméterként vesz fel, a következő feltételekkel:

  • kimenet fizz a 3 többszörösei helyett;
  • zümmögést ad ki az 5 többszörösei helyett;
  • fizzbuzz kimenet olyan számok helyett, amelyek a 3 és az 5 többszörösei is.

Példa

Fizzbuzz (5)

Eredmény

1
2
// fizz
4
//zümmögés

Elemezzük a feladatot

Itt a lényeg az, hogy a JavaScript használatával többszöröseket találjunk. Megvalósítható a modulus operátor vagy a maradék - % segítségével, amely lehetővé teszi a maradék megjelenítését két szám felosztásánál. Ha a maradék 0, az azt jelenti, hogy az első szám többszöröse a másodiknak.

12% 5 // 2 -> A 12 nem többszöröse az 5-nek
12% 3 // 0 -> 12 a 3 többszöröse

Tehát, ha 12-t osztunk 5-tel, 2-t kapunk 2-vel. Ha 12-t elosztunk 3-mal, 4-et kapunk 0 maradékkal. Az első esetben a 12 nem többszöröse az 5-nek, a másodikban , a 12 a 3 többszöröse.

döntés

Az optimális megoldás a következő kód lenne:

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

A függvény feltételes utasítások segítségével elvégzi a szükséges ellenőrzéseket, és a felhasználó által kért eredményt állítja elő. A feladatban érdemes odafigyelni az if...else utasítások sorrendjére: dupla feltétellel (&&) kezdjük, és azzal az esettel fejezzük be, ahol több szám nem található. Ennek eredményeként minden lehetőséget lefedünk.

Anagramma

Ez egy olyan szó neve, amely egy másik szó összes betűjét tartalmazza ugyanabban a számban, de eltérő sorrendben.

staging

Írnunk kell egy függvényt, amely ellenőrzi, hogy két karakterlánc anagramma-e, és a kis- és nagybetű nem számít. Csak a karakterek számítanak; szóközöket vagy írásjeleket nem vesszük figyelembe.

anagramma('kereső', 'barát') —> igaz
anagramma('hello', 'visz') —> false

Elemezzük a feladatot

Itt fontos figyelembe venni, hogy ellenőriznie kell a két beviteli sorban lévő betűket és a sorok számát.

kereső —> f: 1 barát —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Az anagramma adatok tárolásához válasszon egy struktúrát, például egy JavaScript objektum literált. A kulcs ebben az esetben a betű karaktere, az érték az ismétlődések száma az aktuális sorban.

Vannak más feltételek is:

  • Meg kell győződnie arról, hogy a betűk kis- és nagybetűit ne vegyék figyelembe az összehasonlítás során. Egyszerűen mindkét karakterláncot kis- vagy nagybetűvé alakítjuk.
  • Minden nem karaktert kizárunk az összehasonlításból. A legjobb vele dolgozni reguláris kifejezések.

döntés

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

Ügyeljen a használatára Object.keys() a fenti részletben. Ez a metódus olyan tömböt ad vissza, amely neveket vagy kulcsokat tartalmaz abban a sorrendben, ahogyan azok az objektumban megjelennek. Ebben az esetben a tömb a következő lesz:

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

Így megkapjuk az objektum tulajdonságait anélkül, hogy tömeges ciklust kellene csinálni. Probléma esetén ezt a módszert a .length tulajdonsággal használhatja annak ellenőrzésére, hogy mindkét karakterlánc ugyanannyi karakterből áll-e – ez az anagrammák fontos jellemzője.

Magánhangzók keresése

Meglehetősen egyszerű feladat, ami gyakran előkerül az interjúkon.

staging

Olyan függvényt kell írnia, amely egy karakterláncot vesz argumentumként, és visszaadja a karakterláncban található magánhangzók számát.
A magánhangzók „a”, „e”, „i”, „o”, „u”.

Példa:

findVowels('hello') // —> 2
findVowels('miért') // —> 0

döntés

Íme a legegyszerűbb lehetőség:

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
}

Fontos odafigyelni az .includes() metódus használatára. Karakterláncokhoz és tömbökhöz egyaránt elérhető. Ezt annak meghatározására kell használni, hogy egy tömb tartalmaz-e egy bizonyos értéket. Ez a metódus igazat ad vissza, ha a tömb tartalmazza a megadott értéket, és hamis értéket, ha nem.

Van egy rövidebb megoldás a problémára:

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

Ez a .match() metódust használja, amely lehetővé teszi a hatékony keresés megvalósítását. Ha egy reguláris kifejezés metódus argumentumként található a megadott karakterláncon belül, akkor a visszatérési érték egyező karakterek tömbje. Nos, ha nincsenek egyezések, akkor a .match() nullát ad vissza.

Fibonacci

Klasszikus feladat, amely különböző szintű interjúkban található. Érdemes felidézni, hogy a Fibonacci-sorozat olyan számsor, ahol minden következő szám az előző kettő összege. Tehát az első tíz szám így néz ki: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

staging

Olyan függvényt kell írni, amely egy bizonyos sorozatban az n-edik rekordot adja vissza, ahol n a függvény argumentumaként átadott szám.

fibonacci(3) // —> 2

Ez a feladat magában foglalja az argumentumban megadott számú cikluson való végigjárást, és az értéket a megfelelő helyen adja vissza. A probléma felvetésének ez a módja hurkok használatát igényli. Ha ehelyett rekurziót használ, az elnyeri a kérdezőt, és néhány plusz pontot ad.

döntés

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

Az eredménytömbben az első két szám szerepel a sorozatban, mivel a sorozat minden bejegyzése az előző két szám összege. A legelején nincs két szám, amiből a következő számot kaphatjuk, így a ciklus nem tudja automatikusan generálni őket. De mint tudjuk, az első két szám mindig 0 és 1. Ezért az eredménytömböt kézzel is inicializálhatja.

Ami a rekurziót illeti, minden egyszerűbb és bonyolultabb egyszerre:

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

Folyamatosan hívjuk a fibonacci(t), egyre kisebb számokat adva át argumentumként. Megállunk, ha az átadott argumentum 0 vagy 1.

Teljesítmény

Valószínűleg már találkozott ezekkel a feladatokkal, ha interjút készítettek frontend vagy JavaScript fejlesztői állásra (főleg, ha ez junior szinten van). De ha még nem találkozott velük, hasznosak lehetnek a jövőben - legalábbis az általános fejlődés szempontjából.

A Skillbox a következőket ajánlja:

Forrás: will.com

Hozzászólás