5 tüüpilist ülesannet JavaScripti vestlustes: analüüs ja lahendused

5 tüüpilist ülesannet JavaScripti vestlustes: analüüs ja lahendused

Tõlkijalt: oleme teie jaoks artikli avaldanud Maria Antonietta Perna, kes räägib JavaScriptiga seotud tüüpilistest ülesannetest, mis on kõige sagedamini ette pandud arendajate kandidaatidele intervjuudes. Artikkel on eelkõige kasulik alustavatele programmeerijatele.

Tehnoloogiaettevõtete intervjuudest on saanud juba tüütus jutt. Siiski ei ole see üllatav — edukas intervjuu läbitamine avab tee heade töökohtade juurde. Kuid see ei ole sugugi lihtne, kuna sageli on vaja lahendada keerulisi ülesandeid.

Enamasti ei ole enamik neist ülesannetest seotud tööga, mida kandidaat tegema hakkab, kuid neid tuleb ikkagi lahendada. Mõnikord tuleb seda teha tahvelarvutil, ilma Google'i või mõne muu allika abita. Jah, olukord muutub järk-järgult, ja mõned ettevõtted loobuvad sellistest intervjuudest, kuid paljud tööandjad järgivad endiselt seda traditsiooni. See artikkel käsitleb tüüpilisi JavaScripti ülesandeid, mida sageli kasutatakse kandidaatidele ülesannete andmiseks.

Tuletame meelde: kõigile «Habra» lugejatele — 10 000 rubla soodustus, kui registreerite end Skillboxi mis tahes kursusele promokoodi «Habr» abil.

Skillbox soovitab: Praktiline kursus «Mobiilne arendaja PRO».

Peamine — põhjalik ettevalmistus teie intervjuuks

Jah, enne kui hakkame ülesandeid lahendama, vaatame üle üldised näpunäited intervjuuks valmistumiseks.

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

On kasulik õppida lahendust valjult rääkima. Soovitav on rääkida sooritajatele sellest, mida te teete, mitte lihtsalt kirjutada tahvlile (või vaikides koodi arvutisse sisestada). Sel moel, kui teie koodis on viga, kuid lahenduse käik on üldiselt õige, võib see suurendada teie võimalusi edu saavutada.

Ülesande üle tuleb mõelda, enne kui lahendama asuda. Mõnel juhul on võimalik ülesande pinnapealselt mõista ja seejärel vale teed minna. Võib-olla tasub esitada intervjuujuhile mõned täpsustavad küsimused.

Tuleb harjutada koodi käsitsi kirjutamist, mitte arvutis. Tööintervjuudel antakse kandidaadile sageli marker ja tahvel, kus pole mingeid vihjeid ega automaatset vormindamist. Lahenduse leidmiseks on soovitatav kirjutada oma kood paberile või otse tahvlile. Kui hoida kõike peas, võib midagi olulist ununeda.

JavaScripti malliülesanded

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 neid JavaScripti õppimise ajal. Nüüd on aeg need uuesti lahendada, lisades detailse selgituse protsessi kohta.

Palindroom

Palindroom on sõna, lause või sümbolite jada, mis loetakse täpselt samamoodi nii tavapärases suunas kui ka vastupidises suunas. Näiteks 'Anna' on palindroom, samas kui 'table' ja 'John' ei ole.

Ülesanne

Antud on struktuur; tuleb kirjutada funktsioon, mis tagastab true, kui struktuur on palindroom, ja false, kui ei ole. Samuti tuleb arvesse võtta tühikuid ja kirjavahemärke.

palindrome('racecar') === true
palindrome('table') === false

Lahendamise analüüs

Peamine mõte on pöörata string vastupidises suunas. Kui "tagurpidi" string on täielikult identne algsega, siis saime palindroomi ja funktsioon peaks tagastama true. Kui ei, siis false.

Lahendus

Siin on kood, mis aitab lahendada palindroomi küsimust.

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

Esimene samm on muundada sisendi stringi sümbolid väikesteks tähtedeks. See tagab, et programm võrdleb just sümboleid, mitte nende suurust või midagi tõeliselt muud.

Teine samm on stringi pööramine. See pole keeruline: string tuleb muuta massiiviks meetodi .split() abil (Stringi teek). Siis pöörame massiivi, kasutades meetodit .reverse() (Array teek). Viimane etapp on pöörata massiiv tagasi stringiks, kasutades meetodit .join() (Array teek).

Nüüd on kõik, mis jääb, võrrelda "tagurpidi" stringi algsega ning tagastada tulemus true või false.

FizzBuzz

Üks populaarsemaid ülesandeid, mida küsitakse tööintervjuudel.

Ülesanne

Peab kirjutada funktsioon, mis kuvab konsoolis numbreid 1 kuni n, kus n on täisarv, mille funktsioon võtab parameetrina, järgides järgmisi tingimusi:

  • kuva fizz numbrite asemel, mis on jagumisega 3;
  • kuva buzz numbrite asemel, mis on jagumisega 5;
  • kuva fizzbuzz numbrite asemel, mis on jagumisega nii 3 kui ka 5.

Näide

Fizzbuzz(5)

Tulemus

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

Lahendamise analüüs

Siin on oluline viis, kuidas leida jagatavaid numbreid JavaScriptis. Seda saab rakendada modulaatori või jäägi abil — %, mis näitab kahe numbri jagamisel jääki. Kui jääk on 0, siis tähendab see, et esimene number on teise jagatav.

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

Nii, kui jagada 12 5-ga, saame 2 jäägiga 2. Kui jagada 12 3-ga, saame 4 jäägiga 0. Esimesel juhul ei ole 12 5 jagatav, teisel juhul — 12 on 3 jagatav.

Lahendus

Optimaalseks lahenduseks on järgmine kood:

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

Funktsioon teeb vajalikke kontrolle kasutades tingimuslikke operaatoriteid ja annab kasutajale vajaliku tulemuse. Ülesandes tuleb tähelepanu pöörata if…else opsioonide järjekorrale: alustada topelt tingimusest (&&) ja lõpetada juhul, kui mitmekordseid numbreid ei õnnestunud leida. Tulemuseks katame kõik variandid.

Anaagramm

Nii nimetatakse sõna, mis sisaldab kõiki teise sõna tähti samas koguses, kuid teises järjekorras.

Ülesanne

On vaja kirjutada funktsioon, mis kontrollib, kas kaks stringi on anaagrammid, kusjuures tähtede suurus ei oma tähtsust. Arvesse lähevad vaid sümbolid; tühikud või kirjavahemärgid ei arvestata.

anagram(‘finder’, ‘Friend’) —> true
anagram(‘hello’, ‘bye’) —> false

Lahendamise analüüs

Siin on oluline arvesse võtta, et tuleb kontrollida iga tähe olemasolu 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 säilitamiseks anaagrammi jaoks tuleks valida struktuur, nagu JavaScripti objektiliteraal. Sel juhul on võti tähe sümbol, väärtus on selle korduste arv praeguses stringis.

On ka teisi tingimusi:

  • Peame veenduma, et tähekohad ei mängi võrdlemisel rolli. Lihtsalt teisendame mõlemad stringid kas väikesteks või suurteks tähtedeks.
  • Võrdlemisest välja jätma kõik mitte-sümbolid. 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
}

Pange tähele, et kasutatakse Object.keys() eelnevas koodilõigus. See meetod tagastab massiivi, mis sisaldab nimesid või võtmeid sama järjestusega, nagu need esinevad objektis. 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 omadusega .length — kontrollimisel, kas mõlemas stringis on sama palju Sümboleid — see on tähtis omadus anagrammide puhul.

Vokaalide leidmine

Suhteeliselt lihtne ülesanne, mis esineb sageli intervjuudes.

Ülesanne

Peame kirjutama funktsiooni, mis võtab argumendiks stringi 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 pöörata tähelepanu meetodi .includes() kasutusele. See on saadaval nii struktuuride kui ka massiivide jaoks. Seda tuleks kasutada selleks, et tuvastada, kas massiiv sisaldab kindlat väärtust. See meetod tagastab true, kui massiiv sisaldab määratud väärtust, ja false, kui ei.

On ka lühem lahendus probleemile:

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

Siin kasutatakse meetodit .match(), mis võimaldab teostada tõhusat otsingut. Kui regulaarne väljend argumendina meetodil leitakse määratud stringi sees, siis tagastatav väärtus on vastavate sümbolite massiiv. Kui vasteid ei leita, tagastab .match() null.

Fibonacci

Klassikaline probleem, mida võib kohata erineva tasemega vestlustel. Tuleb meenutada, et Fibonacci jada on arvude rida, kus iga järgmine on kahe eelneva summa. Nii näevad välja esimesed kümme numbrit: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Ülesanne

Peate kirjutama funktsiooni, mis tagastab n-ndas kirje teatud järjekorras, kus n on number, mis edastatakse funktsiooni argumendina.

fibonacci(3) // -> 2

See ülesanne hõlmab tsükli läbimist nii palju kordi, kui on märgitud argumendis, tagastades vastava positsiooni väärtuse. Selle ülesande määratlemise viis nõuab tsüklite kasutamist. Kui kasutate selle asemel rekursiooni, võib see meeldida intervjueerijale ja anda teile mõned lisapunktid.

Lahendus

const fibonacci = num => {
  // salvestage Fibonacci järjend, mida olete
  // kavatsemas genereerida, ja
  // algatage järjend esimese kahe
  // järjendi numbriga
  const result = [0, 1]

  for(let i = 2; i <= num; i++) {
    // lisage kahe numbri summa
    // enne positsiooni i tulemustesse
    // järjendi lõpus
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // tagastage viimane väärtus päästikust
  return result[num]
}

Tulemuste massiivis asuvad esimesed kaks numbrit reas, kuna iga järjestuse kirje koosneb kahe eelneva arvu summast. Alguses ei ole kahte arvu, millega järgmine number saada, seega ei saa tsükkel neid automaatselt genereerida. Kuid nagu me teame, on esimesed kaks numbrit alati 0 ja 1. Seetõttu saab tulemuste massiivi käsitsi initsialiseerida.

Mis puutub rekursiooni, siis siin on kõik lihtsam ja samal ajal keerulisem:

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

Me jätkame fibonacci() kutsumist, edastades järjest väiksemaid numbreid argumentidena. Peatume juhul, kui edastatud argument on 0 või 1.

Kokkuvõte

Tõenäoliselt olete juba kokku puutunud mõne nimetatud ülesandega, kui olete läbinud frontend- või JavaScript-arendaja tööintervjuusid (eriti kui tegemist on noorema tasemega). Kuid isegi kui te ei ole nendega kokku puutunud, võivad need tulevikus kasuks tulla — vähemalt üldiseks arenguks.

Skillbox soovitab:

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster