5 typische JavaScript-interviewtaken: analyse en oplossingen

5 typische JavaScript-interviewtaken: analyse en oplossingen

Van de vertaler: heeft een artikel voor u gepubliceerd Maria Antonietta Perna, die vertelt over veelvoorkomende JavaScript-taken, meestal aangeboden aan aanvragers van ontwikkelaars tijdens interviews. Het artikel zal in de eerste plaats nuttig zijn voor beginnende programmeurs.

Interviews bij technologiebedrijven zijn al lang het gesprek van de dag. Dit zou geen verrassing moeten zijn: het succesvol afleggen van een sollicitatiegesprek geeft je de kans om een ​​goede baan te krijgen. Maar dit is niet zo eenvoudig, omdat complexe problemen vaak moeten worden opgelost.

Bovendien houden de meeste van deze taken meestal geen verband met het werk dat de aanvrager zal uitvoeren, maar moeten ze nog steeds worden opgelost. Soms moet je het op het bord doen, zonder contact op te nemen met Google of een andere bron. Ja, de situatie verandert geleidelijk en sommige bedrijven laten dergelijke interviews achterwege, maar veel werkgevers houden zich nog steeds aan deze traditie. Dit artikel is gewijd aan de analyse van typische JavaScript-taken die vaak worden gebruikt als taken voor werkzoekenden.

Herinnering: voor alle lezers van "Habr" - een korting van 10 roebel bij inschrijving voor een Skillbox-cursus met behulp van de promotiecode "Habr".

Skillbox beveelt aan: Praktische cursus "Mobiele ontwikkelaar PRO".

Het belangrijkste is om je grondig voor te bereiden op je sollicitatiegesprek.

Ja, voordat we naar de taken gaan kijken, laten we eerst eens kijken naar enkele algemene tips voor de voorbereiding van sollicitatiegesprekken.

Het belangrijkste is om je van tevoren voor te bereiden. Test hoe goed u algoritmen en datastructuren onthoudt en verbeter uw kennis op gebieden waar u niet zo bekend mee bent. Er zijn veel online platforms die u kunnen helpen bij de voorbereiding op sollicitatiegesprekken. Wij adviseren GeeksvoorGeeks, kinderwagen, Interviewen.io и CodeSignaal.

Het is de moeite waard om de beslissing hardop te leren uitspreken. Het is raadzaam om sollicitanten te vertellen wat u doet, en niet alleen maar op het bord te schrijven (of code in de computer te typen, ook in stilte). Op deze manier kunt u, als u een fout maakt in de code, maar de oplossing over het algemeen correct is, uw kansen op succes vergroten.

Je moet het probleem begrijpen voordat je het begint op te lossen. In sommige gevallen begrijpt u een taak misschien oppervlakkig en gaat u vervolgens de verkeerde weg in. Het kan de moeite waard zijn om een ​​paar verduidelijkende vragen aan de interviewer te stellen.

U moet oefenen met het schrijven van code met de hand, niet op een pc. Het komt voor dat de sollicitant tijdens interviews een marker en een whiteboard krijgt, zonder hints of automatische opmaak. Als u op zoek bent naar een oplossing, is het de moeite waard om uw code op een stuk papier of rechtstreeks op het bord te schrijven. Als je alles in je hoofd houdt, vergeet je misschien iets belangrijks.

Sjabloontaken in JavaScript

Sommige van deze taken zijn u waarschijnlijk al bekend. Je hebt interviews gehad waarin je iets soortgelijks moest oplossen, of je hebt erop geoefend terwijl je JavaScript leerde. Welnu, nu is het tijd om ze opnieuw op te lossen, en met een gedetailleerde uitleg van het proces.

Palindroom

Een palindroom is een woord, zin of reeks karakters die zowel in de gebruikelijke richting als in de tegenovergestelde richting precies hetzelfde wordt gelezen. ‘Anna’ is bijvoorbeeld een palindroom, maar ‘tafel’ en ‘John’ zijn dat niet.

Enscenering

Gegeven een string; je moet een functie schrijven waarmee je true kunt retourneren als de string een palindroom is, en false als dat niet het geval is. In dit geval moet u rekening houden met spaties en leestekens.

palindroom('raceauto') === waar
palindroom('tabel') === false

Laten we de taak analyseren

Het belangrijkste idee hier is om de string om te keren. Als de “omgekeerde” string volledig identiek is aan de originele, dan hebben we een palindroom ontvangen en zou de functie waar moeten retourneren. Zo niet: vals.

beslissing

Hier is de code die het palindroom oplost.

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

De eerste stap is het converteren van de tekens in de invoerreeks naar kleine letters. Dit is een garantie dat het programma de karakters zelf zal vergelijken, en geen hoofdletters of iets anders.

De tweede stap is het omkeren van de lijn. Dit is niet moeilijk om te doen: je moet het naar een array converteren met behulp van de .split() -methode (String-bibliotheek). Vervolgens keren we de array om met .reverse() (arraybibliotheek). De laatste stap is het converteren van de omgekeerde array naar een string met behulp van .join() (arraybibliotheek).

Nu hoeft u alleen maar de “omgekeerde” string te vergelijken met de originele string, waarbij het resultaat waar of onwaar is.

FizzBuzz

Een van de meest populaire taken in interviews.

Enscenering

U moet een functie schrijven die getallen van 1 tot n naar de console afdrukt, waarbij n een geheel getal is dat de functie als parameter aanneemt, met de volgende voorwaarden:

  • output fizz in plaats van veelvouden van 3;
  • output buzz in plaats van getallen die veelvouden zijn van 5;
  • fizzbuzz-uitvoer in plaats van getallen die een veelvoud zijn van zowel 3 als 5.

Voorbeeld

Bruisbuzz(5)

Resultaat

// 1
// 2
// bruisen
// 4
//ophef

Laten we de taak analyseren

Het belangrijkste hier is een manier om veelvouden te vinden met behulp van JavaScript. Het kan worden geïmplementeerd met behulp van de modulusoperator of de rest -%, waarmee u de rest kunt weergeven bij het delen van twee getallen. Als de rest 0 is, betekent dit dat het eerste getal een veelvoud is van het tweede.

12% 5 // 2 -> 12 is geen veelvoud van 5
12% 3 // 0 -> 12 is een veelvoud van 3

Dus als je 12 door 5 deelt, krijg je 2 met een rest van 2. Als je 12 door 3 deelt, krijg je 4 met een rest van 0. In het eerste geval is 12 geen veelvoud van 5, in het tweede geval , 12 is een veelvoud van 3.

beslissing

De optimale oplossing zou de volgende code zijn:

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

De functie voert de noodzakelijke controles uit met behulp van voorwaardelijke instructies en produceert het door de gebruiker gewenste resultaat. In het probleem is het de moeite waard om aandacht te besteden aan de volgorde van de if...else-instructies: begin met een dubbele voorwaarde (&&) en eindig met het geval waarin meerdere getallen niet konden worden gevonden. Hierdoor behandelen wij alle opties.

Anagram

Dit is de naam voor een woord dat alle letters van een ander woord in hetzelfde nummer bevat, maar in een andere volgorde.

Enscenering

We moeten een functie schrijven die controleert of twee strings anagrammen zijn, en het hoofdlettergebruik doet er niet toe. Alleen karakters worden geteld; Er wordt geen rekening gehouden met spaties of leestekens.

anagram('vinder', 'Vriend') —> waar
anagram('hallo', 'doei') —> false

Laten we de taak analyseren

Het belangrijkste om te overwegen is dat u elke letter in de twee invoerregels en hun nummer op elke regel moet controleren.

vinder —> f: 1 vriend —> f: 1
ik: 1 r: 1
n: 1 ik: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

Om anagramgegevens op te slaan, moet u een structuur kiezen, zoals een letterlijk JavaScript-object. De sleutel in dit geval is het karakter van de letter, de waarde is het aantal herhalingen op de huidige regel.

Er zijn nog andere voorwaarden:

  • U moet ervoor zorgen dat bij het vergelijken geen rekening wordt gehouden met het geval van letters. We converteren eenvoudigweg beide tekenreeksen naar kleine letters of hoofdletters.
  • We sluiten alle niet-karakters uit van de vergelijking. Het beste om mee te werken normale uitdrukkingen.

beslissing

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

Let op het gebruik Object.keys () in het fragment hierboven. Deze methode retourneert een array met namen of sleutels in dezelfde volgorde als waarin ze in het object voorkomen. In dit geval zal de array er als volgt uitzien:

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

Op deze manier krijgen we de eigenschappen van het object zonder een bulklus te hoeven doen. Bij een probleem kun je deze methode gebruiken met de eigenschap .length om te controleren of beide strings hetzelfde aantal tekens hebben - dit is een belangrijk kenmerk van anagrammen.

Zoek naar klinkers

Een vrij eenvoudige taak die vaak naar voren komt in interviews.

Enscenering

Je moet een functie schrijven die een string als argument neemt en het aantal klinkers teruggeeft dat in de string zit.
De klinkers zijn “a”, “e”, “i”, “o”, “u”.

Voorbeeld:

findKlinkers('hallo') // —> 2
findKlinkers('waarom') // —> 0

beslissing

Dit is de eenvoudigste optie:

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
}

Het is belangrijk om aandacht te besteden aan het gebruik van de methode .includes(). Het is beschikbaar voor zowel strings als arrays. Het moet worden gebruikt om te bepalen of een array een bepaalde waarde bevat. Deze methode retourneert true als de array de opgegeven waarde bevat, en false als dit niet het geval is.

Er is een kortere oplossing voor het probleem:

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

Hierbij wordt gebruik gemaakt van de .match()-methode, waarmee u efficiënt kunt zoeken. Als er binnen de opgegeven tekenreeks een reguliere expressie als methodeargument wordt gevonden, is de geretourneerde waarde een array van overeenkomende tekens. Als er geen overeenkomsten zijn, retourneert .match() null.

Fibonacci

Een klassieke taak die terug te vinden is in interviews op verschillende niveaus. Het is de moeite waard eraan te herinneren dat de Fibonacci-reeks een reeks getallen is waarbij elke volgende de som is van de voorgaande twee. De eerste tien cijfers zien er dus zo uit: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Enscenering

U moet een functie schrijven die het n-de record in een bepaalde reeks retourneert, waarbij n het getal is dat als argument aan de functie wordt doorgegeven.

fibonacci(3) // —> 2

Deze taak houdt in dat u het aantal keren dat in het argument is opgegeven, door een lus loopt en de waarde op de juiste positie retourneert. Deze manier om het probleem te stellen vereist het gebruik van lussen. Als u in plaats daarvan recursie gebruikt, kan dit de interviewer een plezier doen en u een paar extra punten opleveren.

beslissing

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 de resultatenreeks zijn de eerste twee getallen in de reeks opgenomen, omdat elk item in de reeks de som is van de voorgaande twee getallen. Helemaal aan het begin zijn er geen twee getallen die kunnen worden gebruikt om het volgende getal te krijgen, dus de lus kan deze niet automatisch genereren. Maar zoals we weten zijn de eerste twee getallen altijd 0 en 1. Daarom kunt u de resultatenreeks handmatig initialiseren.

Wat recursie betreft, alles is tegelijkertijd eenvoudiger en gecompliceerder:

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

We blijven fibonacci() aanroepen, waarbij we steeds kleinere getallen als argumenten doorgeven. We stoppen wanneer het doorgegeven argument 0 of 1 is.

Uitgang

Hoogstwaarschijnlijk ben je al een van deze taken tegengekomen als je bent geïnterviewd voor een baan als frontend- of JavaScript-ontwikkelaar (vooral als het op juniorniveau is). Maar als u ze nog niet bent tegengekomen, kunnen ze in de toekomst nuttig zijn – tenminste voor de algemene ontwikkeling.

Skillbox beveelt aan:

Bron: www.habr.com

Voeg een reactie