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 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.
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”.
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.
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.