5 typiske JavaScript-intervjuoppgaver: analyse og løsninger

5 typiske JavaScript-intervjuoppgaver: analyse og løsninger

Fra oversetteren: publiserte en artikkel for deg Maria Antonietta Perna, som snakker om vanlige JavaScript-oppgaver, oftest tilbudt utviklersøkere under intervjuer. Artikkelen vil være nyttig, først av alt, for nybegynnere programmerere.

Intervjuer hos teknologiselskaper har lenge vært snakk om byen. Dette burde ikke være overraskende - å bestå et intervju gir deg muligheten til å få en god jobb. Men dette er ikke så enkelt, siden komplekse problemer ofte må løses.

Dessuten er de fleste av disse oppgavene oftest ikke relatert til arbeidet som søkeren skal utføre, men de må fortsatt løses. Noen ganger må du gjøre det på tavlen, uten å sjekke med Google eller noen annen kilde. Ja, situasjonen endrer seg gradvis, og noen selskaper forlater slike intervjuer, men mange arbeidsgivere holder seg fortsatt til denne tradisjonen. Denne artikkelen er viet analyse av typiske JavaScript-oppgaver som ofte brukes som oppgaver for jobbsøkere.

Vi minner om: for alle lesere av "Habr" - en rabatt på 10 000 rubler når du melder deg på et hvilket som helst Skillbox-kurs ved å bruke kampanjekoden "Habr".

Skillbox anbefaler: Praktisk kurs "Mobilutvikler PRO".

Det viktigste er å forberede deg grundig til intervjuet ditt.

Ja, før vi begynner å se på oppgavene, la oss se på noen generelle tips til intervjuforberedelse.

Det viktigste er å forberede seg på forhånd. Test hvor godt du husker algoritmer og datastrukturer, og forbedre kunnskapen din på områder du ikke er så godt kjent med. Det er mange nettplattformer som kan hjelpe deg med å forberede deg til intervjuer. Vi gir råd geeksforgeeks, Prampe, Intervjuer.io и Kodesignal.

Det er verdt å lære å si avgjørelsen høyt. Det er lurt å fortelle søkere om hva du gjør, og ikke bare skrive på tavlen (eller skrive inn kode i datamaskinen, også stille). På denne måten, hvis du gjør en feil i koden, men løsningen er generelt riktig, kan du øke sjansene dine for å lykkes.

Du må forstå problemet før du begynner å løse det. I noen tilfeller kan du forstå en oppgave overfladisk og deretter gå feil vei. Det kan være verdt å stille noen oppklarende spørsmål til intervjueren.

Du må trene på å skrive kode for hånd, ikke på en PC. Det hender at søkeren under intervjuer får en markør og en tavle, der det ikke er noen hint eller automatisk formatering. Når du leter etter en løsning, er det verdt å skrive ned koden din på et stykke papir eller direkte på tavlen. Hvis du holder alt i hodet, kan du glemme noe viktig.

Maloppgaver i JavaScript

Noen av disse oppgavene er sannsynligvis allerede kjent for deg. Du har enten hatt intervjuer der du måtte løse noe lignende, eller øvd på dem mens du lærte JavaScript. Vel, nå er det på tide å løse dem igjen, og med en detaljert forklaring av prosessen.

Palindrom

Et palindrom er et ord, setning eller tegnsekvens som leses nøyaktig likt både i vanlig retning og i motsatt retning. For eksempel er "Anna" et palindrom, men "bord" og "John" er det ikke.

Iscenesettelse

Gitt en streng; du må skrive en funksjon som lar deg returnere sant hvis strengen er et palindrom, og usant hvis ikke. I dette tilfellet må du ta hensyn til mellomrom og skilletegn.

palindrome('racecar') === sant
palindrome('tabell') === usann

La oss analysere oppgaven

Hovedideen her er å snu strengen. Hvis den "omvendte" strengen er helt identisk med den opprinnelige, har vi mottatt et palindrom og funksjonen skal returnere sant. Hvis ikke, falsk.

beslutning

Her er koden som løser 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 trinnet er å konvertere tegnene i inndatastrengen til små bokstaver. Dette er en garanti for at programmet vil sammenligne karakterene selv, og ikke kasus eller noe annet.

Det andre trinnet er å snu linjen. Dette er ikke vanskelig å gjøre: du må konvertere den til en matrise ved å bruke .split()-metoden (String library). Deretter reverserer vi matrisen ved å bruke .reverse() (Array-bibliotek). Det siste trinnet er å konvertere den omvendte matrisen til en streng ved å bruke .join() (Array-bibliotek).

Nå er alt du trenger å gjøre å sammenligne den "omvendte" strengen med den opprinnelige strengen, og returnere resultatet sant eller usant.

FizzBuzz

En av de mest populære oppgavene i intervjuer.

Iscenesettelse

Du må skrive en funksjon som skriver ut tall fra 1 til n til konsollen, der n er et heltall som funksjonen tar som en parameter, med følgende betingelser:

  • output brus i stedet for multipler av 3;
  • output buzz i stedet for tall som er multipler av 5;
  • fizzbuzz-utgang i stedet for tall som er multipler av både 3 og 5.

Eksempel

Fizzbuzz(5)

Resultat

// 1
// 2
// brus
// 4
//buzz

La oss analysere oppgaven

Det viktigste her er en måte å finne multipler ved å bruke JavaScript. Det kan implementeres ved å bruke modulusoperatoren eller resten - %, som lar deg vise resten når du deler to tall. Hvis resten er 0, betyr det at det første tallet er et multiplum av det andre.

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

Så hvis du deler 12 på 5, får du 2 med resten av 2. Hvis du deler 12 på 3, får du 4 med resten av 0. I det første tilfellet er ikke 12 et multiplum av 5, i det andre , 12 er et multiplum av 3.

beslutning

Den optimale løsningen vil 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)
    }
  }
}

Funksjonen utfører de nødvendige kontrollene ved å bruke betingede utsagn og produserer resultatet som kreves av brukeren. I oppgaven er det verdt å ta hensyn til rekkefølgen til if...else-setningene: start med en dobbel betingelse (&&) og avslutt med tilfellet hvor flere tall ikke ble funnet. Som et resultat dekker vi alle alternativer.

Anagram

Dette er navnet på et ord som inneholder alle bokstavene i et annet ord i samme nummer, men i en annen rekkefølge.

Iscenesettelse

Vi må skrive en funksjon som sjekker om to strenger er anagrammer, og tilfellet spiller ingen rolle. Bare tegn telles; mellomrom eller skilletegn er ikke tatt i betraktning.

anagram('finder', 'Venn') —> sant
anagram('hei', 'bye') —> usant

La oss analysere oppgaven

Det som er viktig å vurdere her er at du må sjekke hver bokstav i de to inndatalinjene og deres nummer i hver linje.

finner —> f: 1 venn —> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1

For å lagre anagramdata bør du velge en struktur som et bokstavelig JavaScript-objekt. Nøkkelen i dette tilfellet er bokstavens karakter, verdien er antall repetisjoner i gjeldende linje.

Det er andre forhold:

  • Du må forsikre deg om at tilfellet med bokstaver ikke tas i betraktning når du sammenligner. Vi konverterer ganske enkelt begge strengene til små eller store bokstaver.
  • Vi ekskluderer alle ikke-tegn fra sammenligningen. Best å jobbe med vanlig uttrykk.

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 oppmerksom på bruken Object.keys () i utdraget ovenfor. Denne metoden returnerer en matrise som inneholder navn eller nøkler i samme rekkefølge som de vises i objektet. I dette tilfellet vil matrisen være slik:

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

På denne måten får vi egenskapene til objektet uten å måtte gjøre en bulksløyfe. I et problem kan du bruke denne metoden med .length-egenskapen for å sjekke om begge strengene har samme antall tegn - dette er en viktig funksjon ved anagrammer.

Søk etter vokaler

En ganske enkel oppgave som ofte dukker opp i intervjuer.

Iscenesettelse

Du må skrive en funksjon som tar en streng som et argument og returnerer antall vokaler som er inneholdt i strengen.
Vokalene er "a", "e", "i", "o", "u".

Eksempel:

findVowels('hei') // —> 2
findVowels('hvorfor') // —> 0

beslutning

Her er det enkleste alternativet:

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 viktig å være oppmerksom på bruken av .includes()-metoden. Den er tilgjengelig for både strenger og arrays. Den skal brukes til å bestemme om en matrise inneholder en bestemt verdi. Denne metoden returnerer true hvis matrisen inneholder den angitte verdien, og false hvis den ikke gjør det.

Det er en kortere løsning på problemet:

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

Denne bruker metoden .match(), som lar deg implementere et effektivt søk. Hvis et regulært uttrykk som et metodeargument finnes i den angitte strengen, er returverdien en rekke samsvarende tegn. Vel, hvis det ikke er noen treff, returnerer .match() null.

Fibonacci

En klassisk oppgave som finnes i intervjuer på ulike nivåer. Det er verdt å huske på at Fibonacci-sekvensen er en serie tall der hvert påfølgende er summen av de to foregående. Så de første ti tallene ser slik ut: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Iscenesettelse

Du må skrive en funksjon som returnerer den n-te posten i en bestemt rekkefølge, hvor n er tallet som sendes som argument til funksjonen.

fibonacci(3) // —> 2

Denne oppgaven innebærer å gå gjennom en sløyfe det antall ganger som er spesifisert i argumentet, og returnere verdien til riktig posisjon. Denne måten å stille problemet på krever bruk av løkker. Hvis du bruker rekursjon i stedet, kan det glede intervjueren og gi deg noen ekstra poeng.

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 resultatmatrisen er de to første tallene i serien fordi hver oppføring i sekvensen er summen av de to foregående tallene. Helt i begynnelsen er det ikke to tall som kan tas for å få det neste tallet, så loopen kan ikke generere dem automatisk. Men, som vi vet, er de to første tallene alltid 0 og 1. Derfor kan du initialisere resultatmatrisen manuelt.

Når det gjelder rekursjon, er alt enklere og mer komplisert 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 fortsetter å kalle fibonacci(), og sender mindre og mindre tall som argumenter. Vi stopper når det beståtte argumentet er 0 eller 1.

Utgang

Mest sannsynlig har du allerede støtt på noen av disse oppgavene hvis du har blitt intervjuet for en frontend- eller JavaScript-utviklerjobb (spesielt hvis det er på juniornivå). Men hvis du ikke har kommet over dem, kan de være nyttige i fremtiden - i hvert fall for generell utvikling.

Skillbox anbefaler:

Kilde: www.habr.com

Legg til en kommentar