5 Algemene JavaScript-onderhoudprobleme: Analise en oplossings

5 Algemene JavaScript-onderhoudprobleme: Analise en oplossings

Van die vertaler: 'n artikel vir jou gepubliseer Maria Antonietta Perna, wat praat oor tipiese JavaScript-take, meestal aangebied aan aansoekers-ontwikkelaars by onderhoude. Die artikel sal in die eerste plek nuttig wees vir beginner programmeerders.

Onderhoude in tegnologiemaatskappye is lankal die gesprek van die dorp. Dit is nie verbasend nie - die suksesvolle voltooiing van die onderhoud maak dit moontlik om 'n goeie werk te kry. Maar dit is nie so maklik nie, want dikwels is dit nodig om komplekse probleme op te los.

Boonop hou die meeste van hierdie take meestal nie verband met die werk wat die aansoeker sal verrig nie, maar dit moet steeds opgelos word. Soms moet jy dit op die bord doen, sonder om met Google of enige ander bron na te gaan. Ja, die situasie verander geleidelik, en in sommige maatskappye weier hulle sulke onderhoude, maar baie werkgewers hou steeds by hierdie tradisie. Hierdie artikel word gewy aan die ontleding van tipiese JavaScript-take wat dikwels as take vir aansoekers gebruik word.

Ons herinner: vir alle lesers van "Habr" - 'n afslag van 10 000 roebels wanneer u inskryf vir enige Skillbox-kursus met behulp van die "Habr"-promosiekode.

Skillbox beveel aan: Praktiese kursus "Mobiele ontwikkelaar PRO".

Die belangrikste ding is om noukeurig voor te berei vir jou onderhoud.

Ja, voor ons die take begin afbreek, kom ons kyk na 'n paar algemene wenke vir voorbereiding vir 'n onderhoud.

Die belangrikste ding is om vooraf voor te berei. Kyk hoe goed jy algoritmes en datastrukture onthou, en verbeter jou kennis op gebiede waarmee jy nie baie vertroud is nie. Daar is baie aanlyn platforms om jou te help voorberei vir onderhoude. Ons adviseer geeksforgeeks, Pramp, Onderhoudvoering.io и Kodesein.

Dit is die moeite werd om te leer om die besluit hardop uit te spreek. Dit is raadsaam om aansoekers te vertel wat jy doen, en nie net op die bord te skryf nie (of kode op die rekenaar in te tik, ook stilweg). Dus, as jy 'n fout in die kode maak, maar die oplossing is oor die algemeen korrek, kan jy jou kanse op sukses verhoog.

Die probleem moet verstaan ​​word voordat die oplossing begin kan word. In sommige gevalle kan jy die taak oppervlakkig verstaan ​​en dan op die verkeerde pad gaan. Dit kan die moeite werd wees om 'n paar verduidelikende vrae aan die onderhoudvoerder te vra.

Jy moet oefen om kode met die hand te skryf, nie op 'n rekenaar nie. Dit gebeur dat die aansoeker tydens onderhoude 'n nasiener en 'n bord kry waar daar geen opdragte of outomatiese formatering is nie. Wanneer jy na 'n oplossing soek, skryf jou kode op 'n stuk papier of reg op die bord neer. As jy alles in jou kop hou, kan jy iets belangrik vergeet.

Sjabloontake in JavaScript

Jy is waarskynlik reeds vertroud met sommige van hierdie take. Jy het óf onderhoude gevoer waar jy iets soortgelyks moes oplos, óf jy het daarop geoefen terwyl jy JavaScript geleer het. Wel, nou is dit tyd om hulle weer op te los, en met 'n gedetailleerde verduideliking van die proses.

Palindroom

'n Palindroom is 'n woord, sin of reeks karakters wat presies dieselfde lees, beide in die gewone rigting en in die teenoorgestelde rigting. Byvoorbeeld, "Anna" is 'n palindroom, maar "tafel" en "John" is nie.

Opvoering

'n string gegee; jy moet 'n funksie skryf wat jou toelaat om waar te gee as die string 'n palindroom is, en anders vals. In hierdie geval moet spasies en leestekens in ag geneem word.

palindroom('renmotor') === waar
palindroom('tabel') === onwaar

Ontleed die taak

Die hoofgedagte hier is om die tou agteruit te draai. As die "omgekeerde" string heeltemal identies is aan die oorspronklike een, dan het ons 'n palindroom gekry en die funksie moet waar terugkeer. Indien nie, vals.

besluit

Hier is die kode wat jou toelaat om die palindroom op te los.

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

Die eerste stap is om die invoerstringkarakters na kleinletters om te skakel. Dit is 'n waarborg dat die program presies die karakters self sal vergelyk, en nie geval of iets anders nie.

Die tweede stap is die omgekeerde van die lyn. Dit is maklik om te doen: jy moet dit omskakel na 'n skikking deur die .split()-metode (String-biblioteek) te gebruik. Dan keer ons die skikking om met .reverse() (Array-biblioteek). Die laaste stap is om die omgekeerde skikking na 'n string om te skakel deur .join() (Array-biblioteek) te gebruik.

Al wat nou nodig is, is om die "omgekeerde" string met die oorspronklike een te vergelyk, en gee die resultaat waar of onwaar.

fizzbuzz

Een van die gewildste werksonderhoude.

Opvoering

Dit word vereis om 'n funksie wat getalle van 1 tot n vertoon na die konsole te skryf, waar n 'n heelgetal is wat die funksie as 'n parameter neem, met die volgende voorwaardes:

  • uitset bruis in plaas van veelvoude van 3;
  • buzz-uitvoer in plaas van veelvoude van 5;
  • fizzbuzz-uitset in plaas van veelvoude van beide 3 en 5.

Voorbeeld

Fizzbuzz(5)

Gevolg

// 1
// 2
// bruis
// 4
// gons

Ontleed die taak

Die belangrikste ding hier is die manier om veelvoude te vind met JavaScript. Dit kan geïmplementeer word deur die modulusoperateur of die res -% te gebruik, wat jou toelaat om die res te wys wanneer twee getalle gedeel word. As die res 0 is, beteken dit dat die eerste getal 'n veelvoud van die tweede is.

12% 5 // 2 -> 12 is nie 'n veelvoud van 5 nie
12% 3 // 0 -> 12 is veelvoud van 3

Dus, as ons 12 deur 5 deel, kry ons 2 met 'n res van 2. As ons 12 deur 3 deel, dan kry ons 4 met 'n res van 0. In die eerste geval is 12 nie 'n veelvoud van 5 nie, in die tweedens, 12 is 'n veelvoud van 3.

besluit

Die beste oplossing sal die volgende kode wees:

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

Die funksie voer die nodige kontrole uit met behulp van voorwaardelike stellings en lewer die resultaat wat deur die gebruiker vereis word. In die taak is dit die moeite werd om aandag te gee aan die volgorde van die if...else-stellings: begin met 'n dubbele voorwaarde (&&) en eindig met die geval wanneer veelvuldige getalle nie gevind kon word nie. As gevolg hiervan dek ons ​​alle opsies.

Anagram

Dit is die naam van 'n woord wat al die letters van 'n ander woord in dieselfde nommer bevat, maar in 'n ander volgorde.

Opvoering

Ons moet 'n funksie skryf wat kontroleer of twee stringe anagramme is, en die hoofletters van letters maak nie saak nie. Slegs karakters tel; spasies of leestekens word nie in ag geneem nie.

anagram('finder', 'Vriend') --> waar
anagram('hallo', 'totsiens') --> vals

Ontleed die taak

Hier is dit belangrik om in ag te neem dat dit nodig is om elke letter in twee invoerreëls en hul nommer in elke reël na te gaan.

vinder -> f: 1 vriend -> f: 1
ek: 1 r: 1
n: 1 ek: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Om anagramdata te stoor, moet u 'n struktuur soos 'n letterlike JavaScript-objek kies. Die sleutel in hierdie geval is die karakter van die letter, die waarde is die aantal herhalings daarvan in die huidige reël.

Daar is ook ander voorwaardes:

  • Jy moet seker maak dat die geval van letters nie in ag geneem word wanneer jy vergelyk nie. Skakel net albei stringe om na kleinletters of hoofletters.
  • Ons sluit alle nie-karakters uit van die vergelyking. Beste om mee te werk gereelde uitdrukkings.

besluit

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

Gee aandag aan die gebruik Object.keys() in die brokkie hierbo. Hierdie metode gee 'n skikking terug wat die name of sleutels bevat in dieselfde volgorde as wat hulle in die voorwerp verskyn. In hierdie geval sal die skikking soos volg wees:

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

Op hierdie manier kry ons die eienskappe van die voorwerp sonder om 'n groot lus te doen. In 'n taak kan jy hierdie metode met die .length-eienskap gebruik - om te kyk of beide stringe dieselfde aantal karakters het - dit is 'n belangrike kenmerk van anagramme.

Vokaal soek

'n Redelik eenvoudige taak wat dikwels in onderhoude voorkom.

Opvoering

Jy moet 'n funksie skryf wat 'n string as 'n argument neem en die aantal vokale wat die string bevat, terugstuur.
Die vokale is "a", "e", "i", "o", "u".

Voorbeeld:

findVwels('hallo') // --> 2
findVwels('waarom') // --> 0

besluit

Hier is die maklikste opsie:

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
}

Dit is belangrik om aandag te skenk aan die gebruik van die .includes() metode. Dit is beskikbaar vir beide stringe en skikkings. Dit moet gebruik word om uit te vind of 'n skikking 'n sekere waarde bevat. Hierdie metode gee waar as die skikking die gespesifiseerde waarde bevat en anders vals.

Daar is ook 'n korter oplossing vir die probleem:

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

Die .match() metode word hier gebruik, wat jou toelaat om 'n doeltreffende soektog te implementeer. As 'n gereelde uitdrukking as 'n metode-argument binne die gespesifiseerde string gevind word, dan is die terugkeerwaarde 'n reeks ooreenstemmende karakters. Wel, as daar geen passings is nie, dan gee .match() nul terug.

Fibonacci

'n Klassieke taak wat by onderhoude van verskeie vlakke vervul kan word. Dit is die moeite werd om te onthou dat die Fibonacci-reeks 'n reeks getalle is, waar elke daaropvolgende een die som van die vorige twee is. Dus, die eerste tien getalle lyk soos volg: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Opvoering

Jy moet 'n funksie skryf wat die nde rekord in 'n sekere volgorde terugstuur, en n is 'n getal wat as 'n argument na die funksie deurgegee word.

fibonacci(3) // --> 2

Hierdie taak behels die herhaling van die aantal kere wat in die argument gespesifiseer is, en die waarde op die toepaslike posisie terugstuur. Hierdie manier om die probleem op te stel vereis die gebruik van lusse. As jy eerder rekursie gebruik, kan die onderhoudvoerder daarvan hou en vir jou 'n paar ekstra punte gee.

besluit

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

In die resultaatskikking word die eerste twee getalle in 'n ry vervat, want elke inskrywing in die ry bestaan ​​uit die som van die vorige twee getalle. Daar is nie twee nommers heel aan die begin wat geneem kan word om die volgende nommer te kry nie, so die lus kan dit nie outomaties genereer nie. Maar, soos ons weet, is die eerste twee getalle altyd 0 en 1. Daarom kan jy die resultaatskikking handmatig inisialiseer.

Wat rekursie betref, is alles terselfdertyd eenvoudiger en meer ingewikkeld:

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

Ons hou aan om fibonacci() te noem, en gee in kleiner en kleiner getalle as argumente. Ons stop wanneer die geslaagde argument 0 of 1 is.

Output

Waarskynlik, jy het alreeds enige van hierdie take in die gesig gestaar as jy onderhoude voer vir 'n werk as 'n frontend of JavaScript-ontwikkelaar (veral as dit 'n junior vlak is). Maar as jy hulle nie teëgekom het nie, kan hulle in die toekoms handig te pas kom - ten minste vir algemene ontwikkeling.

Skillbox beveel aan:

Bron: will.com

Voeg 'n opmerking