5 levinumat JavaScripti intervjuuprobleemi: analüüs ja lahendused

5 levinumat JavaScripti intervjuuprobleemi: analüüs ja lahendused

Tõlkijalt: avaldas teile artikli Maria Antonietta Perna, kes räägib tüüpilistest JavaScripti ülesannetest, mida pakutakse kõige sagedamini taotlejatele-arendajatele intervjuudel. Artikkel on kasulik ennekõike algajatele programmeerijatele.

Intervjuud tehnoloogiaettevõtetes on juba ammu kõneaineks olnud. See pole üllatav – intervjuu edukas läbimine võimaldab saada heale tööle. Kuid see pole nii lihtne, sest sageli on vaja lahendada keerulisi probleeme.

Pealegi ei ole enamik neist ülesannetest enamasti seotud tööga, mida taotleja teeb, kuid need tuleb siiski lahendada. Mõnikord peate seda tegema tahvlil ilma Google'ist või mõnest muust allikast kontrollimata. Jah, olukord muutub järk-järgult ja mõnes ettevõttes keeldutakse sellistest intervjuudest, kuid paljud tööandjad peavad seda traditsiooni endiselt kinni. See artikkel on pühendatud tüüpiliste JavaScripti ülesannete analüüsile, mida sageli kasutatakse taotlejate ülesannetena.

Tuletame meelde: kõigile "Habr" lugejatele - allahindlus 10 000 rubla, kui registreerute mis tahes Skillboxi kursusele, kasutades sooduskoodi "Habr".

Skillbox soovitab: Praktiline kursus "Mobile Developer PRO".

Peaasi on intervjuuks hoolikalt valmistuda.

Jah, enne kui hakkame ülesandeid jaotama, vaatame mõningaid üldisi näpunäiteid intervjuuks valmistumiseks.

Peaasi on eelnevalt ette valmistada. Kontrollige, kui hästi mäletate algoritme ja andmestruktuure, ning täiendage oma teadmisi valdkondades, mida te väga ei tunne. Intervjuudeks valmistumiseks on palju veebiplatvorme. Anname nõu geeksforgeeks, Pramp, Intervjueerimine.io и CodeSignal.

Tasub õppida otsust valjusti hääldama. Soovitatav on taotlejatele öelda, mida te teete, mitte lihtsalt tahvlile kirjutada (või trükkida arvutisse kood, ka vaikselt). Seega, kui teete koodis vea, kuid lahendus on üldiselt õige, saate oma eduvõimalusi suurendada.

Enne lahenduse leidmist tuleb probleemist aru saada. Mõnel juhul saate ülesandest pealiskaudselt aru ja siis minna valele teele. Võib-olla tasub intervjueerijale esitada paar täpsustavat küsimust.

Peate harjutama koodi kirjutamist käsitsi, mitte arvutis. Juhtub, et intervjuudel antakse taotlejale marker ja tahvel, kus puuduvad viipad ega automaatne vormindamine. Lahendust otsides kirjuta oma kood paberile või otse tahvlile. Kui hoiate kõike oma peas, võite unustada midagi olulist.

Malli ülesanded JavaScriptis

Tõenäoliselt olete mõnega neist ülesannetest juba tuttav. Võtsite kas intervjuud, kus pidite midagi sarnast lahendama, või harjutasite neid JavaScripti õppimise ajal. Noh, nüüd on aeg need uuesti lahendada ja koos protsessi üksikasjaliku selgitusega.

Palindroom

Palindroom on sõna, lause või märgijada, mis loeb täpselt ühtemoodi nii tavapärases suunas kui ka vastupidises suunas. Näiteks "Anna" on palindroom, aga "laud" ja "John" mitte.

Lavastus

Antud string; peate kirjutama funktsiooni, mis võimaldab teil tagastada tõene, kui string on palindroom, ja false muul juhul. Sel juhul tuleb arvestada tühikute ja kirjavahemärkidega.

palindroom('ralliauto') === tõsi
palindroom('tabel') === false

Ülesande sõelumine

Peamine idee on siin keerata nöör tagurpidi. Kui "tagurpidi" string on täiesti identne algse stringiga, siis saime palindroomi ja funktsioon peaks tagastama tõese. Kui ei, siis vale.

otsus

Siin on kood, mis võimaldab teil palindroomi lahendada.

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

Esimene samm on teisendada sisendstringi märgid väiketähtedeks. See on garantii, et programm võrdleb täpselt tegelasi endid, mitte juhtumit ega midagi muud.

Teine samm on joone tagurpidi. Seda on lihtne teha: peate selle teisendama massiiviks, kasutades meetodit .split() (stringiteek). Seejärel pöörame massiivi ümber, kasutades .reverse() (massiiviteek). Viimane samm on pöördmassiivi teisendamine stringiks, kasutades .join() (massiiviteek).

Nüüd pole vaja muud kui võrrelda "tagurpidi" stringi algse stringiga, tagastades tulemuse tõene või väär.

kihiseb

Üks populaarsemaid tööintervjuusid.

Lavastus

Konsooli tuleb kirjutada funktsioon, mis kuvab numbreid vahemikus 1 kuni n, kus n on täisarv, mille funktsioon võtab parameetrina järgmistel tingimustel:

  • väljund kihise 3 kordsete asemel;
  • buzz väljund 5 kordajate asemel;
  • fizzbuzzi väljund nii 3 kui 5 kordajate asemel.

Näide

Fizzbuzz (5)

Tulemus

1
2
// kihisema
4
//buzz

Ülesande sõelumine

Peamine on siin viis, kuidas JavaScripti abil kordseid leida. Seda saab realiseerida moodulite operaatori või jäägi -% abil, mis võimaldab kahe arvu jagamisel näidata jääki. Kui jääk on 0, tähendab see, et esimene arv on teise kordne.

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

Seega, kui jagame 12 5-ga, saame 2 jäägiga 2. Kui jagame 12 3-ga, saame 4 jäägiga 0. Esimesel juhul ei ole 12 5 kordne. teiseks, 12 on 3 kordne.

otsus

Parim lahendus oleks järgmine kood:

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

Funktsioon teostab tingimuslausete abil vajalikud kontrollid ja annab kasutaja poolt nõutud tulemuse. Ülesandes tasub tähelepanu pöörata if...else lausete järjekorrale: alustades topelttingimusest (&&) ja lõpetades juhtumiga, kui mitut numbrit ei leitud. Selle tulemusena käsitleme kõiki võimalusi.

Anagramm

See on sõna nimi, mis sisaldab kõiki teise sõna tähti samas numbris, kuid erinevas järjekorras.

Lavastus

Peame kirjutama funktsiooni, mis kontrollib, kas kaks stringi on anagrammid ja tähtede suurtähtedel pole tähtsust. Loevad ainult tähemärgid; tühikuid ega kirjavahemärke ei võeta arvesse.

anagramm('leidja', 'sõber') --> tõsi
anagramm ('tere', 'hüvasti') --> false

Ülesande sõelumine

Siin on oluline arvestada, et on vaja kontrollida iga tähte kahel sisestusreal ja nende numbrit igal real.

leidja -> f: 1 sõber -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Anagrammiandmete salvestamiseks peaksite valima struktuuri, näiteks JavaScripti objektiliteraali. Võti on sel juhul tähe märk, väärtus on selle korduste arv jooksval real.

On ka teisi tingimusi:

  • Peate jälgima, et võrdlemisel ei võetaks arvesse tähtede väiketähti. Teisendage lihtsalt mõlemad stringid väike- või suurtähtedeks.
  • Jätame võrdlusest välja kõik mittetegelased. Parim töötamiseks regulaaravaldised.

otsus

// 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() ülaltoodud lõigus. See meetod tagastab massiivi, mis sisaldab nimesid või võtmeid samas järjekorras, nagu need objektis esinevad. Sel juhul on massiiv järgmine:

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

Nii saame objekti omadused ilma suurt tsüklit tegemata. Ülesandes saab seda meetodit kasutada atribuudiga .length – kontrollimaks, kas mõlemas stringis on sama arv märke – see on anagrammide oluline omadus.

Vokaalotsing

Üsna lihtne ülesanne, mis intervjuudel sageli ette tuleb.

Lavastus

Peate kirjutama funktsiooni, mis võtab argumendina stringi ja tagastab stringis sisalduvate vokaalide arvu.
Täishäälikud on "a", "e", "i", "o", "u".

Näide:

findVowels('tere') // --> 2
findVowels('miks') // --> 0

otsus

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() kasutamisele. See on saadaval nii stringide kui ka massiivide jaoks. Seda tuleks kasutada selleks, et teada saada, kas massiiv sisaldab teatud väärtust. See meetod tagastab tõese, kui massiiv sisaldab määratud väärtust, ja false muul juhul.

Probleemile on ka lühem lahendus:

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

Siin kasutatakse meetodit .match(), mis võimaldab rakendada tõhusat otsingut. Kui regulaaravaldis meetodi argumendina leitakse määratud stringist, on tagastusväärtuseks sobivate märkide massiiv. Noh, kui vasteid pole, tagastab .match() null.

Fibonacci

Klassikaline ülesanne, mida saab täita erineva tasemega intervjuudel. Tasub meenutada, et Fibonacci jada on arvude jada, kus iga järgnev on kahe eelmise summa. Esimesed kümme numbrit näevad välja sellised: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Lavastus

Peate kirjutama funktsiooni, mis tagastab n-nda kirje teatud järjestuses ja n on arv, mis edastatakse funktsioonile argumendina.

fibonacci(3) // --> 2

See ülesanne hõlmab argumendis määratud arvu kordi läbimist, tagastades väärtuse sobivas kohas. Selline probleemi seadmise viis nõuab silmuste kasutamist. Kui kasutate selle asemel rekursiooni, võib see intervjueerijale meeldida ja anda teile mõned lisapunktid.

otsus

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

Tulemusmassiivis sisalduvad kaks esimest numbrit reas, kuna jada iga kirje koosneb kahe eelmise arvu summast. Päris alguses ei ole kahte numbrit, mida saaks võtta järgmise numbri saamiseks, seega ei saa tsükkel neid automaatselt genereerida. Kuid nagu me teame, on kaks esimest numbrit alati 0 ja 1. Seetõttu saate tulemuse massiivi käsitsi lähtestada.

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

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

Me kutsume pidevalt välja fibonacci(), esitades argumentidena järjest väiksemaid numbreid. Peatume, kui läbitud argument on 0 või 1.

Väljund

Tõenäoliselt olete juba mõnega neist ülesannetest silmitsi seisnud, kui intervjueerisite tööintervjuu kasutajaliidese või JavaScripti arendajana (eriti kui see on noorem tase). Kuid kui te neid ei kohanud, võivad need tulevikus kasuks tulla - vähemalt üldiseks arenguks.

Skillbox soovitab:

Allikas: www.habr.com

Lisa kommentaar