5 Almindelige JavaScript-interviewproblemer: Analyse og løsninger

5 Almindelige JavaScript-interviewproblemer: Analyse og løsninger

Fra oversætteren: udgivet en artikel til dig Maria Antonietta Perna, der fortæller om typiske JavaScript-opgaver, oftest tilbudt ansøgere-udviklere ved samtaler. Artiklen vil først og fremmest være nyttig for nybegyndere.

Interviews i teknologivirksomheder har længe været tale om byen. Det er ikke overraskende - den vellykkede gennemførelse af samtalen gør det muligt at få et godt job. Men det er ikke så nemt, for ofte er det nødvendigt at løse komplekse problemer.

Desuden er de fleste af disse opgaver oftest ikke relateret til det arbejde, som ansøgeren skal udføre, men de skal stadig løses. Nogle gange skal du gøre det på tavlen uden at tjekke med Google eller nogen anden kilde. Ja, situationen ændrer sig gradvist, og i nogle virksomheder afviser de sådanne interviews, men mange arbejdsgivere holder stadig fast i denne tradition. Denne artikel er afsat til analyse af typiske JavaScript-opgaver, der ofte bruges som opgaver for ansøgere.

Påmindelse: for alle læsere af "Habr" - en rabat på 10 rubler ved tilmelding til ethvert Skillbox-kursus ved hjælp af "Habr"-kampagnekoden.

Skillbox anbefaler: Praktisk kursus "Mobiludvikler PRO".

Det vigtigste er at forberede sig omhyggeligt til dit interview.

Ja, før vi begynder at nedbryde opgaverne, så lad os se på nogle generelle tips til forberedelse til en samtale.

Det vigtigste er at forberede sig på forhånd. Tjek, hvor godt du husker algoritmer og datastrukturer, og forbedre din viden på områder, som du ikke er særlig fortrolig med. Der er mange online platforme til at hjælpe dig med at forberede dig til interviews. Vi rådgiver geeksforgeeks, Prampe, Interviewing.io и Kodesignal.

Det er værd at lære at udtale beslutningen højt. Det er tilrådeligt at fortælle ansøgerne, hvad du laver, og ikke bare skrive på tavlen (eller skrive kode på computeren, også lydløst). Hvis du altså laver en fejl i koden, men løsningen generelt er korrekt, kan du øge dine chancer for succes.

Problemet skal forstås, før løsningen kan startes. I nogle tilfælde kan du overfladisk forstå opgaven og derefter gå den forkerte vej. Det kan være værd at stille et par opklarende spørgsmål til intervieweren.

Du skal øve dig i at skrive kode i hånden, ikke på en pc. Det sker, at ansøgeren ved samtaler får en markør og en tavle, hvor der ikke er tip eller automatisk formatering. Når du leder efter en løsning, så skriv din kode ned på et stykke papir eller direkte på tavlen. Hvis du holder alt i hovedet, kan du glemme noget vigtigt.

Skabelonopgaver i JavaScript

Du er sikkert allerede bekendt med nogle af disse opgaver. Du tog enten interviews, hvor du skulle løse noget lignende, eller du øvede dig på dem, mens du lærte JavaScript. Nå, nu er det tid til at løse dem igen, og med en detaljeret forklaring af processen.

Palindrom

Et palindrom er et ord, en sætning eller en sekvens af tegn, der læses på nøjagtig samme måde både i den sædvanlige retning og i den modsatte retning. For eksempel er "Anna" et palindrom, men "bord" og "John" er det ikke.

produktion

Givet en streng; du skal skrive en funktion, der giver dig mulighed for at returnere sand, hvis strengen er et palindrom, og ellers falsk. I dette tilfælde skal der tages hensyn til mellemrum og tegnsætningstegn.

palindrome('racerbil') === sand
palindrome('table') === falsk

Parser opgaven

Hovedideen her er at vende snoren bagud. Hvis den "omvendte" streng er fuldstændig identisk med den originale, så fik vi et palindrom, og funktionen skulle returnere sand. Hvis ikke, falsk.

beslutning

Her er koden, der giver dig mulighed for at løse palindromet.

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

Det første trin er at konvertere de indtastede strengtegn til små bogstaver. Dette er en garanti for, at programmet vil sammenligne præcis karaktererne selv, og ikke kasus eller noget andet.

Det andet trin er det omvendte af linjen. Dette er nemt at gøre: du skal konvertere det til et array ved hjælp af .split() metoden (String library). Derefter vender vi arrayet ved hjælp af .reverse() (Array library). Det sidste trin er at konvertere det omvendte array til en streng ved hjælp af .join() (Array-bibliotek).

Nu er alt, der skal til, at sammenligne den "omvendte" streng med den originale, hvilket returnerer resultatet sandt eller falsk.

fizzbuzz

En af de mest populære jobsamtaler.

produktion

Det er påkrævet at skrive en funktion, der viser tal fra 1 til n til konsollen, hvor n er et heltal, som funktionen tager som en parameter, med følgende betingelser:

  • output brus i stedet for multipla af 3;
  • buzz output i stedet for multipla af 5;
  • fizzbuzz-output i stedet for multipla af både 3 og 5.

Eksempel

Fizzbuzz(5)

Outcome

// 1/XNUMX/XNUMX
// 2/XNUMX/XNUMX
// brus
// 4/XNUMX/XNUMX
//summen

Parser opgaven

Det vigtigste her er måden at finde multipler ved hjælp af JavaScript. Det kan implementeres ved hjælp af modulusoperatoren eller resten -%, som giver dig mulighed for at vise resten, når du deler to tal. Hvis resten er 0, betyder det, at det første tal er et multiplum af det andet.

12% 5 // 2 -> 12 er ikke et multiplum af 5
12% 3 // 0 -> 12 er multiplum af 3

Så hvis vi dividerer 12 med 5, får vi 2 med en rest af 2. Hvis vi dividerer 12 med 3, så får vi 4 med en rest på 0. I det første tilfælde er 12 ikke et multiplum af 5, i det andet er 12 et multiplum af 3.

beslutning

Den bedste løsning ville være følgende kode:

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

Funktionen udfører de nødvendige kontroller ved hjælp af betingede udsagn og producerer det resultat, som brugeren kræver. I opgaven er det værd at være opmærksom på rækkefølgen af ​​if...else-udsagn: begyndende med en dobbeltbetingelse (&&) og slutte med tilfældet, hvor flere tal ikke kunne findes. Som et resultat dækker vi alle muligheder.

Anagram

Dette er navnet på et ord, der indeholder alle bogstaverne i et andet ord i samme nummer, men i en anden rækkefølge.

produktion

Vi skal skrive en funktion, der kontrollerer, om to strenge er anagrammer, og bogstavernes store og små bogstaver er ligegyldige. Kun tegn tæller; mellemrum eller tegnsætningstegn tages ikke i betragtning.

anagram('finder', 'Ven') --> sandt
anagram('hej', 'farvel') --> falsk

Parser opgaven

Her er det vigtigt at overveje, at det er nødvendigt at kontrollere hvert bogstav i to inputlinjer og deres nummer i hver linje.

finder -> f: 1 ven -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r:1 d:1

Til lagring af anagramdata bør du vælge en struktur som f.eks. et JavaScript-objekt. Nøglen i dette tilfælde er bogstavets karakter, værdien er antallet af gentagelser af det i den aktuelle linje.

Der er også andre forhold:

  • Du skal sikre dig, at der ikke tages højde for bogstavernes tilfælde, når du sammenligner. Bare konverter begge strenge til små eller store bogstaver.
  • Vi udelukker alle ikke-tegn fra sammenligningen. Bedst at arbejde med regulære udtryk.

beslutning

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

Vær opmærksom på brugen Object.keys() i uddraget ovenfor. Denne metode returnerer et array, der indeholder navnene eller nøglerne i samme rækkefølge, som de vises i objektet. I dette tilfælde vil arrayet se sådan ud:

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

På denne måde får vi objektets egenskaber uden at skulle lave en stor løkke. I en opgave kan du bruge denne metode med egenskaben .length - for at kontrollere om begge strenge har det samme antal tegn - dette er et vigtigt træk ved anagrammer.

Vokalsøgning

En ret simpel opgave, der ofte støder på i interviews.

produktion

Du skal skrive en funktion, der tager en streng som et argument og returnerer antallet af vokaler, som strengen indeholder.
Vokalerne er "a", "e", "i", "o", "u".

Eksempel:

findVowels('hej') // --> 2
findVowels('hvorfor') // --> 0

beslutning

Her er den nemmeste mulighed:

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
}

Det er vigtigt at være opmærksom på brugen af ​​.includes() metoden. Den er tilgængelig til både strenge og arrays. Det skal bruges til at finde ud af, om et array indeholder en bestemt værdi. Denne metode returnerer sand, hvis arrayet indeholder den angivne værdi og ellers false.

Der er også en kortere løsning på problemet:

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

Her bruges .match() metoden, som giver dig mulighed for at implementere en effektiv søgning. Hvis et regulært udtryk som et metodeargument findes i den angivne streng, er returværdien en matrix af matchende tegn. Hvis der ikke er nogen match, så returnerer .match() null.

Fibonacci

En klassisk opgave, der kan løses ved interviews på forskellige niveauer. Det er værd at huske på, at Fibonacci-sekvensen er en række tal, hvor hver efterfølgende er summen af ​​de to foregående. Så de første ti tal ser således ud: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

produktion

Du skal skrive en funktion, der returnerer den n'te post i en bestemt rækkefølge, og n er et tal, der sendes som et argument til funktionen.

fibonacci(3) // --> 2

Denne opgave indebærer at gå gennem det antal gange, der er angivet i argumentet, og returnere værdien til den passende position. Denne måde at indstille problemet på kræver brug af loops. Hvis du i stedet bruger rekursion, vil intervieweren måske kunne lide det og give dig et par ekstra point.

beslutning

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

I resultatarrayet er de to første tal indeholdt i en række, fordi hver indgang i rækkefølgen består af summen af ​​de to foregående tal. Der er ikke to tal helt i begyndelsen, der kan tages for at få det næste tal, så løkken kan ikke generere dem automatisk. Men som vi ved, er de to første tal altid 0 og 1. Derfor kan du initialisere resultatarrayet manuelt.

Hvad angår rekursion, er alt enklere og mere kompliceret på samme tid:

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

Vi bliver ved med at kalde fibonacci() og sender mindre og mindre tal som argumenter. Vi stopper, når det beståede argument er 0 eller 1.

Output

Mest sandsynligt har du allerede stået over for nogen af ​​disse opgaver, hvis du var til samtale til et job som frontend- eller JavaScript-udvikler (især hvis det er et juniorniveau). Men hvis du ikke stødte på dem, kan de være nyttige i fremtiden - i det mindste for generel udvikling.

Skillbox anbefaler:

Kilde: www.habr.com

Tilføj en kommentar