
Fra oversætteren: har vi offentliggjort en artikel , som oftest tilbydes udvikleransøgere under interviews. Artiklen vil være nyttig, især for nye programmører.
Interviews i teknologiske virksomheder er længe blevet en myte. Det er ikke overraskende, at et vellykket interview giver mulighed for at få et godt job. Men det er ikke så enkelt, da det ofte kræver, at man løser komplekse opgaver.
Desuden har de fleste af disse opgaver sjældent noget at gøre med det arbejde, ansøgeren skal udføre, men de skal alligevel løses. Nogle gange skal det gøres på en tavle uden adgang til Google eller enhver anden kilde. Ja, situationen ændrer sig gradvist, og i nogle virksomheder opgiver de denne interviewmetode, men mange arbejdsgivere holder stadig fast i denne tradition. Denne artikel handler om typiske JavaScript-opgaver, der ofte bruges som opgaver for ansøgere.
Vi minder om: til alle læsere af 'Habr' — rabat på 10.000 rubler ved tilmelding til et hvilket som helst Skillbox-kursus med rabatkoden 'Habr'.
Skillbox anbefaler: Praktisk kursus .
Det vigtigste er grundig forberedelse til dit interview
Ja, inden vi starter med at gennemgå opgaverne, lad os se på nogle generelle råd til forberedelse til interviewet.
Det vigtigste er at forberede sig på forhånd. Tjek, hvor godt du husker algoritmer og datatyper, og forbedr din viden inden for de områder, du ikke er så godt fortrolig med. Der er mange online platforme, der kan hjælpe med forberedelsen til interviews. Vi anbefaler , , og .
Det er værd at lære at formulere løsningen højt. Det er ønskeligt at fortælle intervieweren, hvad du gør, i stedet for bare at skrive på tavlen (eller skrive koden på computeren i stilhed). På den måde, hvis du laver en fejl i koden, men din løsningsmetode generelt er korrekt, kan du øge dine chancer for succes.
Opgaven skal overvejes, før du påbegynder løsningen. I nogle tilfælde kan du ganske let forstå opgaven og derefter gå den forkerte vej. Det kan være en god idé at stille nogle afklarende spørgsmål til intervieweren.
Du skal træne i at skrive kode i hånden, ikke på en PC. Det sker, at ansøgere får en marker og en tavle til jobsamtaler, hvor der hverken er nogen hints eller automatisk formatering. Når du leder efter en løsning, er det en god ide at skrive din kode på et stykke papir eller direkte på tavlen. Hvis du holder det hele i hovedet, kan du glemme noget vigtigt.
Skabelonopgaver i JavaScript
Måske er nogle af disse opgaver allerede kendte for dig. Du har måske deltaget i jobsamtaler, hvor du skulle løse noget lignende, eller du har praktiseret dem under din JavaScript-uddannelse. Nu er det tid til at løse dem igen, men denne gang med en detaljeret forklaring af processen.
Palindrom
Et palindrom er et ord, en sætning eller en sekvens af tegn, der læses helt ens både forfra og bagfra. For eksempel er 'Anna' et palindrom, mens 'table' og 'John' ikke er.
Opstilling
Givet en streng; du skal skrive en funktion, der returnerer værdien true, hvis strengen er et palindrom, og false, hvis den ikke er. Undervejs skal du tage højde for mellemrum og tegnsætning.
palindrome(‘racecar’) === true
palindrome(‘table’) === false
Lad os analysere opgaven
Den grundlæggende idé her er at vende strengen i modsat retning. Hvis den 'omvendte' streng er helt identisk med den oprindelige, så har vi et palindrom, og funktionen skal returnere værdien true. Hvis ikke, så false.
Løsning
Her er koden, der løser palindrom.
const palindrome = str => {
// vend strengen til små bogstaver
str = str.toLowerCase()
// vend inputstrengen og returner resultatet af
// sammenligningen
return str === str.split('').reverse().join('')
}Første skridt er at konvertere tegnene i inputstrengen til små bogstaver. Dette sikrer, at programmet sammenligner netop tegnene og ikke store og små bogstaver eller noget andet.
Andet skridt er at vende strengen om. Det er ikke svært: vi skal konvertere den til et array ved hjælp af metoden .split() (String-biblioteket). Derefter vender vi arrays om ved hjælp af .reverse() (Array-biblioteket). Det sidste skridt er at konvertere det omvendte array til en streng ved hjælp af .join() (Array-biblioteket).
Nu er alt, hvad der er nødvendigt, at sammenligne den 'omvendte' streng med den oprindelige og returnere resultatet true eller false.
FizzBuzz
En af de mest populære opgaver ved jobsamtaler.
Opstilling
Du skal skrive en funktion, der udskriver tallene fra 1 til n, hvor n er et helt tal, som funktionen tager som parameter, med følgende betingelser:
- udskriver fizz i stedet for tal, der er delelige med 3;
- udskriv buzz i stedet for tal, der er delelige med 5;
- udskriv fizzbuzz i stedet for tal, der både er delelige med 3 og 5.
Eksempel
Fizzbuzz(5)
Resultat
// 1
// 2
// fizz
// 4
// buzz
Lad os analysere opgaven
Det vigtigste her er metoden til at finde delelige tal ved hjælp af JavaScript. Dette kan implementeres med modulo-operatoren eller resten — %, som viser resten, når to tal divideres. Hvis resten er 0, betyder det, at det første tal er deleligt med det andet.
12 % 5 // 2 -> 12 er ikke deleligt med 5
12 % 3 // 0 -> 12 er deleligt med 3
Så hvis man deler 12 med 5, får man 2 med en rest på 2. Deler man derimod 12 med 3, får man 4 med en rest på 0. I det første tilfælde er 12 ikke deleligt med 5, i det andet — 12 er deleligt med 3.
Løsning
Den optimale løsning vil være følgende kode:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// tjek om tallet er deleligt med 3 og 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // tjek om tallet er deleligt med 3
else if(i % 3 === 0) {
console.log('fizz')
} // tjek om tallet er deleligt med 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}Funktionen udfører de nødvendige tjek ved hjælp af betingede operatorer og giver det ønskede resultat til brugeren. Opgaven kræver opmærksomhed på rækkefølgen af if…else-operatorerne: begynd med dobbelte betingelser (&&) og slut med tilfælde, hvor der ikke kunne findes delelige tal. Resultatet dækker alle muligheder.
Anagram
Dette er et ord, der indeholder alle bogstaverne i et andet ord i samme antal, men i en anden rækkefølge.
Opstilling
Du skal skrive en funktion, der kontrollerer, om to strenge er anagrammer, idet bogstavernes case ikke tages i betragtning. Kun tegn tælles; mellemrum eller tegnsætning medtages ikke.
anagram(‘finder’, ‘Friend’) -> true
anagram(‘hello’, ‘bye’) -> false
Lad os analysere opgaven
Det er vigtigt at huske, at hver bogstav i de to input-strenge og deres antal i hver streng skal kontrolleres.
finder -> f: 1 friend -> f: 1
i: 1 r: 1
n: 1 i: 1
d: 1 e: 1
e: 1 n: 1
r: 1 d: 1
For at gemme anagrammets data er det en god idé at vælge en struktur som et JavaScript-objektliteral. Nøglen i dette tilfælde er bogstavet, og værdien er antallet af dets forekomster i den aktuelle streng.
Der er også andre betingelser:
- Det skal sikres, at bogstavernes case ikke tages i betragtning ved sammenligning. Bare konverter begge strenge til små eller store bogstaver.
- Udeluk alle ikke-tegn fra sammenligningen. Det er bedst at arbejde med .
Løsning
// 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 af i den ovenstående snippet. Denne metode returnerer et array, der indeholder navne eller nøgler i den samme rækkefølge, som de optræder i objektet. I dette tilfælde vil arrayet se således ud:
[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]
Dermed får vi objektets egenskaber uden at skulle udføre en omfattende løkke. Denne metode kan anvendes med .length egenskaben for at kontrollere, om de to strenge har et ens antal tegn, hvilket er en vigtig egenskab ved anagrammer.
Find vokaler
En ret simpel opgave, der ofte dukker op til interviews.
Opstilling
Du skal skrive en funktion, der tager en streng som argument og returnerer antallet af vokaler, der findes i strengen.
Vokalerne er «a», «e», «i», «o», «u».
Eksempel:
findVowels(‘hello’) // -> 2
findVowels(‘why’) // -> 0
Løsning
Her er den enkleste version:
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 bemærke brugen af metoden .includes(). Denne er tilgængelig for både strenge og arrays. Den bør bruges til at afgøre, om et array indeholder en bestemt værdi. Denne metode returnerer true, hvis arrayet indeholder den angivne værdi, og false, hvis det ikke gør.
Der findes også en mere kortfattet løsning på problemet:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matches.length : 0
}Her anvendes metoden .match(), som muliggør effektiv søgning. Hvis det regulære udtryk som argument for metoden findes inden for den angivne streng, bliver returneringsværdien et array af matchende tegn. Hvis der ikke er nogen matches, returnerer .match() null.
Fibonacci
En klassisk opgave, som kan ses i interviews af varierende sværhedsgrad. Det er værd at minde om, at Fibonacci-sekvensen er en række tal, hvor hvert efterfølgende tal er summen af de to foregående. De første ti tal ser således ud: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Opstilling
Du skal skrive en funktion, der returnerer den n-te post i den pågældende sekvens, hvor n er det tal, der videregives som argument til funktionen.
fibonacci(3) // -> 2
Denne opgave involverer at gennemgå en loop det angivne antal gange, som angivet i argumentet, med returnering af værdien på den relevante position. Denne opgaveformulering kræver brug af loops. Hvis du derimod bruger rekursion, kan det imponere intervieweren og give dig et par ekstra point.
Løsning
const fibonacci = num => {
// gem Fibonacci-sekvensen, du vil
// generere i en array og
// initialiser arrayet med de første to
// tal i sekvensen
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// tilføj summen af de to tal
// der går forud for positionen i result-arrayet
// til slutningen af result-arrayet
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// returner den sidste værdi i result-arrayet
return result[num]
}I resultatsættet er de første to tal indeholdt i rækken, da hver post i sekvensen består af summen af de to foregående tal. I starten er der ikke to tal, man kan tage for at få det næste tal, så loopet kan ikke generere dem automatisk. Men som vi ved, er de første to tal altid 0 og 1. Derfor kan vi initialisere resultatsættet manuelt.
Med hensyn til rekursion er det både enklere og mere kompliceret på samme tid:
const fibonacci = num => {
// hvis num er enten 0 eller 1, returner num
if(num < 2) {
return num
}
// rekursion her
return fibonacci(num - 1) + fibonacci(num - 2)
}Vi fortsætter med at kalde fibonacci(), hvor vi overfører alle mindre tal som argumenter. Vi stopper, når det overførte argument er 0 eller 1.
Output
Du har sandsynligvis allerede stødt på en af de nævnte opgaver, hvis du har deltaget i jobsamtaler til frontend- eller JavaScript-udvikler (især hvis det er på junior-niveau). Men hvis ikke, kan de komme til nytte i fremtiden — som minimum til din generelle udvikling.
Skillbox anbefaler:
- Anvendt online-kursus .
- Online kursus .
- Praktisk års kursus .
Kilde: habr.com
