5 detyra tipike të intervistës JavaScript: analiza dhe zgjidhje

5 detyra tipike të intervistës JavaScript: analiza dhe zgjidhje

Nga përkthyesi: botoi një artikull për ju Maria Antonietta Perna, e cila flet për detyrat e zakonshme të JavaScript, më së shpeshti u ofrohet aplikantëve zhvillues gjatë intervistave. Artikulli do të jetë i dobishëm, para së gjithash, për programuesit fillestarë.

Intervistat në kompanitë e teknologjisë kanë qenë prej kohësh biseda e qytetit. Kjo nuk duhet të jetë befasuese - kalimi me sukses i një interviste ju jep mundësinë për të marrë një punë të mirë. Por kjo nuk është aq e thjeshtë, pasi problemet komplekse shpesh duhet të zgjidhen.

Për më tepër, më shpesh, shumica e këtyre detyrave nuk lidhen me punën që do të kryejë aplikanti, por ato ende duhet të zgjidhen. Ndonjëherë ju duhet ta bëni atë në tabelë, pa kontrolluar me Google ose ndonjë burim tjetër. Po, situata po ndryshon gradualisht, dhe disa kompani po braktisin intervista të tilla, por shumë punëdhënës ende i përmbahen kësaj tradite. Ky artikull i kushtohet analizës së detyrave tipike JavaScript që përdoren shpesh si detyra për punëkërkuesit.

Kujtojmë: për të gjithë lexuesit e "Habr" - një zbritje prej 10 rubla kur regjistroheni në çdo kurs Skillbox duke përdorur kodin promovues "Habr".

Skillbox rekomandon: Kurse praktike "Zhvilluesi i celularit PRO".

Gjëja kryesore është të përgatiteni plotësisht për intervistën tuaj.

Po, përpara se të fillojmë të shikojmë detyrat, le të shohim disa këshilla të përgjithshme për përgatitjen e intervistës.

Gjëja kryesore është të përgatiteni paraprakisht. Testoni se sa mirë i mbani mend algoritmet dhe strukturat e të dhënave dhe përmirësoni njohuritë tuaja në fusha me të cilat nuk jeni shumë të njohur. Ka shumë platforma online që mund t'ju ndihmojnë të përgatiteni për intervista. Ne këshillojmë geeksforgeeks, Pramp, Intervistuar.io и CodeSignal.

Ia vlen të mësosh ta thuash vendimin me zë të lartë. Këshillohet që t'u tregoni aplikantëve për atë që bëni, dhe jo vetëm të shkruani në tabelë (ose të shkruani kodin në kompjuter, gjithashtu në heshtje). Në këtë mënyrë, nëse bëni një gabim në kod, por zgjidhja në përgjithësi është e saktë, mund të rrisni shanset tuaja për sukses.

Ju duhet ta kuptoni problemin përpara se të filloni ta zgjidhni atë. Në disa raste, ju mund ta kuptoni një detyrë sipërfaqësisht dhe më pas të shkoni në rrugën e gabuar. Ndoshta ia vlen t'i bëni disa pyetje sqaruese intervistuesit.

Ju duhet të praktikoni shkrimin e kodit me dorë, jo në një PC. Ndodh që gjatë intervistave aplikantit t'i jepet një marker dhe një tabelë e bardhë, ku nuk ka asnjë aluzion apo formatim automatik. Kur kërkoni një zgjidhje, ia vlen të shkruani kodin tuaj në një copë letër ose direkt në tabelë. Nëse mbani gjithçka në kokën tuaj, mund të harroni diçka të rëndësishme.

Detyrat e modelit në JavaScript

Disa nga këto detyra janë ndoshta tashmë të njohura për ju. Ju ose keni pasur intervista ku ju është dashur të zgjidhni diçka të ngjashme, ose keni praktikuar në to duke mësuar JavaScript. Epo, tani është koha për t'i zgjidhur ato përsëri, dhe me një shpjegim të hollësishëm të procesit.

Palindroma

Një palindrom është një fjalë, fjali ose sekuencë karakteresh që lexohet saktësisht njësoj si në drejtimin e zakonshëm ashtu edhe në drejtim të kundërt. Për shembull, "Anna" është një palindrom, por "tavolina" dhe "Gjoni" nuk janë.

prodhim

Jepet një varg; ju duhet të shkruani një funksion që ju lejon të ktheni true nëse vargu është palindrom, dhe false nëse jo. Në këtë rast, duhet të merrni parasysh hapësirat dhe shenjat e pikësimit.

palindrome ('makinë garash') === e vërtetë
palindrome('tabela') === false

Le të analizojmë detyrën

Ideja kryesore këtu është të përmbysësh vargun. Nëse vargu "i kundërt" është plotësisht identik me atë origjinal, atëherë kemi marrë një palindrom dhe funksioni duhet të kthehet i vërtetë. Nëse jo, false.

vendim

Këtu është kodi që zgjidh palindromën.

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

Hapi i parë është konvertimi i karaktereve në vargun e hyrjes në shkronja të vogla. Kjo është një garanci që programi do të krahasojë vetë personazhet, dhe jo rast apo ndonjë gjë tjetër.

Hapi i dytë është ndryshimi i vijës. Kjo nuk është e vështirë për t'u bërë: ju duhet ta konvertoni atë në një grup duke përdorur metodën .split() (Biblioteka String). Më pas e kthejmë grupin duke përdorur .reverse() (Array library). Hapi i fundit është konvertimi i grupit të kundërt në një varg duke përdorur .join() (Array library).

Tani gjithçka që duhet të bëni është të krahasoni vargun "e kundërt" me vargun origjinal, duke e kthyer rezultatin e vërtetë ose false.

FizzBuzz

Një nga detyrat më të njohura në intervista.

prodhim

Duhet të shkruani një funksion që printon numrat nga 1 në n në tastierë, ku n është një numër i plotë që funksioni merr si parametër, me kushtet e mëposhtme:

  • nxjerr fizz në vend të shumëfishave të 3;
  • nxjerr buzz në vend të numrave që janë shumëfish të 5;
  • Prodhimi fizzbuzz në vend të numrave që janë shumëfish të 3 dhe 5.

Shembull

Fizzbuzz (5)

Result

// 1
// 2
// gaz
// 4
//gumëzhimë

Le të analizojmë detyrën

Gjëja kryesore këtu është një mënyrë për të gjetur shumëfisha duke përdorur JavaScript. Mund të zbatohet duke përdorur operatorin e modulit ose pjesën e mbetur - %, që ju lejon të tregoni pjesën e mbetur kur ndani dy numra. Nëse pjesa e mbetur është 0, do të thotë se numri i parë është shumëfish i të dytit.

12% 5 // 2 -> 12 nuk është shumëfish i 5
12% 3 // 0 -> 12 është shumëfish i 3

Pra, nëse pjesëtoni 12 me 5, merrni 2 me një mbetje prej 2. Nëse pjesëtoni 12 me 3, merrni 4 me një mbetje prej 0. Në rastin e parë, 12 nuk është shumëfish i 5-së, në të dytin , 12 është shumëfish i 3.

vendim

Zgjidhja optimale do të ishte kodi i mëposhtëm:

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

Funksioni kryen kontrollet e nevojshme duke përdorur deklarata të kushtëzuara dhe prodhon rezultatin e kërkuar nga përdoruesi. Në problem, ia vlen t'i kushtohet vëmendje renditjes së pohimeve if...else: filloni me një kusht të dyfishtë (&&) dhe përfundoni me rastin kur nuk u gjetën numra të shumtë. Si rezultat, ne mbulojmë të gjitha opsionet.

Anagrami

Ky është emri për një fjalë që përmban të gjitha shkronjat e një fjale tjetër në të njëjtin numër, por në një rend të ndryshëm.

prodhim

Duhet të shkruajmë një funksion që kontrollon nëse dy vargje janë anagrame dhe rasti nuk ka rëndësi. Vetëm personazhet numërohen; hapësirat apo shenjat e pikësimit nuk merren parasysh.

anagram ('gjetje', 'Mik') —> e vërtetë
anagram ('përshëndetje', 'mirupafshim') —> false

Le të analizojmë detyrën

Gjëja e rëndësishme për t'u marrë parasysh këtu është se ju duhet të kontrolloni secilën shkronjë në dy linjat hyrëse dhe numrin e tyre në secilën rresht.

gjetës —> f: 1 shok —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Për të ruajtur të dhënat e anagramit, duhet të zgjidhni një strukturë të tillë si një objekt JavaScript fjalë për fjalë. Çelësi në këtë rast është karakteri i shkronjës, vlera është numri i përsëritjeve të saj në rreshtin aktual.

Ka kushte të tjera:

  • Duhet të siguroheni që rasti i shkronjave të mos merret parasysh kur krahasoni. Ne thjesht i konvertojmë të dy vargjet në shkronja të vogla ose të mëdha.
  • Ne përjashtojmë të gjithë jo-personazhet nga krahasimi. Më e mira për të punuar shprehjet e rregullta.

vendim

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

Kushtojini vëmendje përdorimit Object.keys() në fragmentin e mësipërm. Kjo metodë kthen një grup që përmban emra ose çelësa në të njëjtin rend që shfaqen në objekt. Në këtë rast, grupi do të jetë si ky:

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

Në këtë mënyrë marrim vetitë e objektit pa pasur nevojë të bëjmë një lak me shumicë. Në një problem, mund ta përdorni këtë metodë me vetinë .length për të kontrolluar nëse të dy vargjet kanë të njëjtin numër karakteresh - kjo është një veçori e rëndësishme e anagrameve.

Kërkoni për zanore

Një detyrë mjaft e thjeshtë që del shpesh në intervista.

prodhim

Ju duhet të shkruani një funksion që merr një varg si argument dhe kthen numrin e zanoreve që përmbahen në varg.
Zanoret janë "a", "e", "i", "o", "u".

Shembull:

find Vowels ('hello') // —> 2
find Vowels ('pse') // —> 0

vendim

Këtu është opsioni më i thjeshtë:

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
}

Është e rëndësishme t'i kushtohet vëmendje përdorimit të metodës .includes(). Është i disponueshëm si për vargjet ashtu edhe për vargje. Duhet të përdoret për të përcaktuar nëse një grup përmban një vlerë të caktuar. Kjo metodë kthen true nëse grupi përmban vlerën e specifikuar dhe false nëse nuk e përmban.

Ekziston një zgjidhje më e shkurtër për problemin:

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

Kjo përdor metodën .match(), e cila ju lejon të zbatoni një kërkim efikas. Nëse një shprehje e rregullt si argument i metodës gjendet brenda vargut të specifikuar, atëherë vlera e kthyer është një grup karakteresh që përputhen. Epo, nëse nuk ka ndeshje, atëherë .match() kthen null.

Fibonacci

Një detyrë klasike që mund të gjendet në intervista në nivele të ndryshme. Vlen të kujtojmë se sekuenca Fibonacci është një seri numrash ku secili i mëpasshëm është shuma e dy të mëparshmeve. Pra, dhjetë numrat e parë duken kështu: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

prodhim

Duhet të shkruani një funksion që kthen rekordin e n-të në një sekuencë të caktuar, ku n është numri që i kalohet funksionit si argument.

fibonacci(3) // —> 2

Kjo detyrë përfshin ecjen nëpër një lak sa herë të specifikuara në argument, duke e kthyer vlerën në pozicionin e duhur. Kjo mënyrë e shtrimit të problemit kërkon përdorimin e sytheve. Nëse përdorni rekursion në vend të kësaj, ai mund të kënaqë intervistuesin dhe t'ju japë disa pikë shtesë.

vendim

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

Në grupin e rezultateve, dy numrat e parë përmbahen në seri sepse çdo hyrje në sekuencë është shuma e dy numrave të mëparshëm. Në fillim nuk ka dy numra që mund të merren për të marrë numrin tjetër, kështu që cikli nuk mund t'i gjenerojë ato automatikisht. Por, siç e dimë, dy numrat e parë janë gjithmonë 0 dhe 1. Prandaj, mund ta inicializoni grupin e rezultateve me dorë.

Sa i përket rekursionit, gjithçka është më e thjeshtë dhe më e ndërlikuar në të njëjtën kohë:

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

Ne vazhdojmë të thërrasim fibonacci(), duke kaluar numra gjithnjë e më të vegjël si argumente. Ne ndalojmë kur argumenti i kaluar është 0 ose 1.

Prodhim

Me shumë mundësi, ju keni hasur tashmë në ndonjë nga këto detyra nëse jeni intervistuar për një punë zhvilluesi të frontendit ose JavaScript (veçanërisht nëse është në nivelin e ri). Por nëse nuk i keni hasur, ato mund të jenë të dobishme në të ardhmen - të paktën për zhvillimin e përgjithshëm.

Skillbox rekomandon:

Burimi: www.habr.com

Shto një koment