5 tĂŒĂŒpilist ĂŒlesannet JavaScripti intervjuudel: analĂŒĂŒs ja lahendused

5 tĂŒĂŒpilist ĂŒlesannet JavaScripti intervjuudel: analĂŒĂŒs ja lahendused

TĂ”lkijalt: oleme avaldanud teile artikli Maria Pernalt, mis rÀÀgib enamlevinud JavaScripti ĂŒlesannetest, mida kĂ”ige sagedamini pakutakse arendaja kandidaatidele tööintervjuudel. Artikkel on kasulik eeskĂ€tt algajatele programmeerijatele.

TööstusettevĂ”tete intervjuud on juba ammu olnud jututeema. Siin pole midagi imelikku – intervjuu edukas lĂ€bimine annab vĂ”imaluse saada hea töö. Kuid see pole sugugi lihtne, kuna sageli tuleb lahendada keerulisi ĂŒlesandeid.

Rohkemasti ei oma enamus neist ĂŒlesannetest mingit seost tööga, mida kandidaat tegema hakkab, kuid neid tuleb ikkagi lahendada. MĂ”nikord on vaja seda teha tahvelarvutil, ilma Google'iga vĂ”i muu allikaga konsulteerimata. Jah, olukord hakkab jĂ€rk-jĂ€rgult muutuma ja mĂ”ned ettevĂ”tted loobuvad sellistest intervjuudest, kuid paljud tööandjad jĂ€rgivad endiselt seda traditsiooni. See artikkel keskendub tĂŒĂŒpilistele JavaScripti ĂŒlesannetele, mida sageli kasutatakse kandidaatide ĂŒlesannete raames.

Tuletame meelde: kĂ”igile «Habr» lugejatele – 10 000 rubla allahindlus igale Skillboxi kursusele, kasutades sooduskoodi «Habr».

Skillbox soovitab: Praktiline kursus «Mobiilne arendaja PRO».

Peamine on pÔhjalik ettevalmistus teie intervjuuks

Jah, enne ĂŒlesannete lahkamist vaatame ĂŒle mĂ”ned ĂŒldised nĂ”uanded ettevalmistamiseks intervjuuks.

Peamine on valmistuda ette. Kontrollige, kui hÀsti te mÀletate algoritme ja andmestruktuure, ja tÀiustage oma teadmisi valdkondades, mis ei ole teile liiga tuttavad. On palju veebiplatvorme, mis aitavad valmistuda intervjuudeks. Soovitame GeeksforGeeks, Pramp, Interviewing.io ja CodeSignal.

Tasub Ă”ppida oma lahendusi valjult rÀÀkima. On soovitatav rÀÀkida kandidaatidele, mida te teete, mitte lihtsalt kirjutada tahvlile (vĂ”i kirjutada koodi arvutisse, samuti vaikselt). Sel viisil, kui teie koodis on viga, kuid lahenduse kĂ€ik on ĂŒleĂŒldiselt Ă”ige, saate suurendada oma eduvĂ”imalusi.

Ülesanne tuleb esmalt mĂ”tteis lĂ€bi töötada, enne kui asute lahendama. MĂ”nel juhul on ĂŒlesande pinnapealne mĂ”istmine ja vale tee peale minek vĂ”imalik. VĂ”ibolla tasub esitada vestlejale mĂ”ned tĂ€psustavad kĂŒsimused.

Koodimise praktiseerimine peaks toimuma kÀsitsi, mitte arvutis. Juhtub, et intervjuudel antakse kandidaadile marker ja tahvel, kus ei ole ei vihjeid ega automaatset vormindamist. Lahenduse leidmisel tasub oma kood kirja panna paberile vÔi otse tahvlile. Kui hoida kÔike peas, vÔib midagi olulist ununeda.

Ć abloonilised ĂŒlesanded JavaScriptis

TĂ”enĂ€oliselt on mĂ”ned neist ĂŒlesannetest teile juba tuttavad. Te olete kas lĂ€binud intervjuusid, kus tuli lahendada midagi sarnast, vĂ”i harjutanud nendega JavaScripti Ă”ppimise ajal. NĂŒĂŒd on aeg need veel kord lahendada, sedakorda aga detailse selgitusega.

Palindroom

Palindroom on sĂ”na, lause vĂ”i mĂ€rkide jĂ€rjestus, mis loetakse tĂ€iesti ĂŒhtemoodi nii tavalises suunas kui ka vastupidises suunas. NĂ€iteks "Anna" on palindroom, samas kui "table" ja "John" ei ole.

Ülesande formular

Antud on string; tuleb kirjutada funktsioon, mis tagastab vÀÀrtuse true, kui string on palindroom, ja false, kui ei ole. Samas tuleb arvesse vĂ”tta tĂŒhikuid ja kirjavahemĂ€rke.

palindrome(‘racecar’) === true
palindrome(‘table’) === false

Lahendame ĂŒlesande

Siin on peamine idee — pöörata string vastupidises suunas. Kui "tagurpidi" string on tĂ€iesti identne algsega, siis saime palindroomi ja funktsioon peaks tagastama vÀÀrtuse true. Kui ei, siis false.

Lahendus

Siin on kood, mis vÔimaldab palindroomi lahendada.

const palindrome = str => {
  // muuda string vÀikesteks tÀhtedeks
  str = str.toLowerCase()
  // pöörame sisendi stringi ja tagastame vÔrgu tulemuse
  // vÔrreldes
  return str === str.split('').reverse().join('')
}

Esimene samm on sisendi stringi sĂŒmbolite muutmine vĂ€ikesteks tĂ€htedeks. See tagab, et programm vĂ”rdleb just sĂŒmboleid, mitte suurust ega midagi muud.

Teine samm on stringi pööramine. See ei ole keeruline: string tuleb muuta massiiviks meetodi .split() (Stringi teek) kaudu. SeejÀrel pöörame massiivi, kasutades .reverse() (Array teek). Viimane etapp on pööratud massiivi muutmine stringiks meetodi .join() (Array teek) abil.

NĂŒĂŒd on kĂ”ik, mis on vajalik, vĂ”rrelda "tagurpidi" stringi algsega, tagastades tulemuse true vĂ”i false.

FizzBuzz

Üks kĂ”ige populaarsemaid ĂŒlesandeid intervjuudel.

Ülesande formular

On vajalik kirjutada funktsioon, mis vÀljastab konsoolisse arvud vahemikus 1 kuni n, kus n on tÀisarv, mille funktsioon vÔtab parameetrina, jÀrgides jÀrgmisi tingimusi:

  • vĂ€ljastab fizz arvude asemel, mis on jaguvad 3-ga;
  • vĂ€ljastab buzz arvude asemel, mis on jaguvad 5-ga;
  • vĂ€ljastab fizzbuzz arvude asemel, mis on jaguvad nii 3- kui ka 5-ga.

NĂ€ide

Fizzbuzz(5)

Tulemus

// 1
// 2
// fizz
// 4
// buzz

Lahendame ĂŒlesande

Peamine asi siin on meetod jagatavate arvude leidmiseks JavaScriptis. Selle saab rakendada, kasutades mooduloperaatorit vĂ”i jÀÀki — %, mis vĂ”imaldab nĂ€idata jÀÀki kahe arvu jagamisel. Kui jÀÀk on 0, tĂ€hendab see, et esimene arv on teise jagaja.

12 % 5 // 2 -> 12 ei ole 5-ga jagatav
12 % 3 // 0 -> 12 on 3-ga jagatav

Nii, kui jagada 12 viiega, saame 2 jÀÀgiga 2. Kui aga jagame 12 kolmega, saame 4 jÀÀgiga 0. Esimeses olukorras ei ole 12 5-ga jagatav, teises — 12 on 3-ga jagatav.

Lahendus

Optimaalse lahendusena on jÀrgmine kood:

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // kontrolli, kas number on 3 ja 5 jagatav
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // kontrolli, kas number on 3 jagatav
      else if(i % 3 === 0) {
      console.log('fizz')
    } // kontrolli, kas number on 5 jagatav
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

Funktsioon viib vajalikud kontrollid lĂ€bi, kasutades tingimuslikke operaatoreid ja annab kasutajale vajalikku tulemust. Ülesandes on oluline tĂ€helepanu pöörata if
else operaatorite jĂ€rjekorrale: alustada kahekordsest tingimusest (&&) ja lĂ”petada juhul, kui jagatavaid arve ei leitud. Tulemusena katame kĂ”ik variandid.

Anagramm

Nii nimetatakse sÔna, mis sisaldab kÔiki teise sÔna tÀhti samas arvus, kuid teises jÀrjekorras.

Ülesande formular

On vajalik kirjutada funktsioon, mis kontrollib, kas kaks stringi on anagrammid, kusjuures tĂ€htede suurus ei oma tĂ€htsust. Arvesse lĂ€hevad ainult sĂŒmbolid; tĂŒhikud vĂ”i kirjavahemĂ€rgid ei arvestata.

anagram('finder', 'Friend') -> true
anagram('hello', 'bye') -> false

Lahendame ĂŒlesande

Siin on oluline arvestada, et tuleb kontrollida igat tÀhte kahes sisendstringis ja nende arvu igas stringis.

finder -> f: 1 friend -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Andmete salvestamiseks anagrammi jaoks on soovitatav valida struktuur, nagu JavaScripti objektiliit.

On ka teisi tingimusi:

  • Peab olema kindel, et tĂ€he suurus ei loe vĂ”rdlemisel. Lase lihtsalt mĂ”lemad stringid alumisse vĂ”i ĂŒlemisse registrisse.
  • VĂ€lista kĂ”ik mitte-sĂŒmbolid vĂ”rlemisest. Parim on töötada regulaarsete vĂ€ljenditega.

Lahendus

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

Pöörake tĂ€helepanu kasutamisele Object.keys() ĂŒlemises koodilĂ”igus. See meetod tagastab massiivi, mis sisaldab nimesid vĂ”i vĂ”tmeid samas jĂ€rjekorras, nagu nad ilmuvad objekti sees. Sel juhul on massiiv jĂ€rgmine:

[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]

Nii saame objekti omadused ilma mahuka tsĂŒklita. Seda meetodit saab kasutada ka .length omaduse korral, et kontrollida, kas mĂ”lemal stringil on sama palju mĂ€rke - see on oluline omadus anagrammide puhul.

Vokaalide otsimine

Rohkem kui lihtne ĂŒlesanne, mis sageli esineb tööturul.

Ülesande formular

Peab kirjutama funktsiooni, mis vÔtab stringi argumendiks ja tagastab vokaalide arvu, mis stringis esinevad.
Vokaalid on «a», «e», «i», «o», «u».

NĂ€ide:

findVowels(‘hello’) // → 2
findVowels(‘why’) // → 0

Lahendus

Siin on kÔige lihtsam variant:

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
}

Oluline on tÀhele panna .includes() meetodi kasutamist. See on saadaval nii stringide kui ka massiivide jaoks. Seda tasub kasutada massiivi teatud vÀÀrtuse olemasolu kindlaksmiseks. See meetod tagastab true, kui massiiv sisaldab mÀÀratud vÀÀrtust, ja false, kui ei.

On olemas ka lĂŒhem lahendus probleemile:

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

Siin kasutatakse .match() meetodit, mis vĂ”imaldab teha tĂ”husat otsingut. Kui regulaarne vĂ€ljend tuvastatakse nimetatud stringi sees, siis tagastatakse vastus sobivate sĂŒmbolite massiivina. Kui aga sobivusi ei ole, siis .match() tagastab null.

Fibonacci

Klassikaline probleem, millega vĂ”ib kokku puutuda erinevatel tööturu tasemetel. Tasub meeles pidada, et Fibonacci jada on numbrite seeria, kus iga jĂ€rgmine number on kahe eelneva summa. Nii nĂ€evad esimesed kĂŒmme numbrit vĂ€lja jĂ€rgmiselt: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Ülesande formular

Peab kirjutama funktsiooni, mis tagastab n-ndas kirje teatud jÀrjestuses, kus n on number, mis antakse funktsiooni argumentidena.

fibonacci(3) // —> 2

See ĂŒlesanne hĂ”lmab tsĂŒkli lĂ€bimist nii palju kordi, kui on mÀÀratud argumendis, tagastades vastava positsiooni vÀÀrtuse. See ĂŒlesande seadmine nĂ”uab tsĂŒklite kasutamist. Kui kasutate selle asemel rekursiooni, vĂ”ib see meeldida intervjuuviijale ja anda mĂ”ned lisapunktid.

Lahendus

const fibonacci = num => {
  // salvestage Fibonacci jÀrjestus, mida kavatsete
  // genereerida massiivi ja
  // initializeeri massiiv esimesed kaks
  // numbrit jÀrjestusest
  const result = [0, 1]

  for(let i = 2; i <= num; i++) {
    // lisage kahe numbri summa
    //, mis eelnevad positsioonile i massiivis result
    // massiivi result lÔppu
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // tagastage viimane vÀÀrtus massiivis result
  return result[num]
}

Massiivi tulemuste esimesed kaks numbrit on reas, kuna iga kirje jĂ€rjestuses koosneb kahest eelnevast numbrist. Alguses ei ole kahte numbrit, mida saaks jĂ€rgmise numbri saamiseks vĂ”tta, seega ei saa tsĂŒkkel neid automaatselt genereerida. Kuid nagu me teame, on esimesed kaks numbrit alati 0 ja 1. Seega saame tulemuste massiivi alguses kĂ€sitsi initsialiseerida.

Mis puutub rekursiooni, siis siin on kÔik lihtsam ja keerulisem korraga:

const fibonacci = num => {
  // kui num on 0 vÔi 1, tagastage num
  if(num < 2) {
    return num
  }
  // rekursioon siin
  return fibonacci(num - 1) + fibonacci(num - 2)
}

Me jÀtkame fibonacci() vÀljakutsumist, edastades jÀrjest vÀiksemaid numbreid argumentidena. Peatume, kui antud argument on 0 vÔi 1.

KokkuvÔte

TĂ”enĂ€oliselt olete juba kokku puutunud mĂ”ne sellise ĂŒlesandega, kui olete lĂ€binud vestlusi frontend- vĂ”i JavaScript-arendajana (eriti kui see on algaja tase). Kuid kui te pole nendega kokku puutunud, siis vĂ”ivad need tulevikus kasuks tulla — vĂ€hemalt ĂŒldiseks enesetĂ€iendamiseks.

Skillbox soovitab:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster