
FrÄn översÀttaren: publicerade vi en artikel , som oftast erbjuds till utvecklare under intervjuer. Artikeln kommer att vara till nytta, frÀmst för nybörjare inom programmering.
Intervjuer pĂ„ teknologiföretag har lĂ€nge blivit en saga i sig. Det Ă€r inte konstigt â att lyckas med en intervju ger möjlighet att fĂ„ ett bra jobb. Men det Ă€r inte sĂ„ enkelt, eftersom man ofta mĂ„ste lösa komplicerade problem.
MÄnga av dessa uppgifter har dessutom inget att göra med det arbete som sökande kommer att utföra, men det krÀvs att man ÀndÄ löser dem. Ibland mÄste man göra detta pÄ en whiteboard, utan att kolla med Google eller nÄgot annat kÀllor. Ja, situationen förÀndras gradvis, och i vissa företag avstÄr man frÄn sÄdana intervjuer, men mÄnga arbetsgivare följer fortfarande denna tradition. Den hÀr artikeln Àr Àgnad Ät att analysera typiska JavaScript-uppgifter som ofta anvÀnds som uppdrag för sökande.
PĂ„minnelse: för alla lĂ€sare av "Habr" â 10 000 rubel rabatt vid registrering för vilken kurs som helst pĂ„ Skillbox med rabattkoden "Habr".
Skillbox rekommenderar: Praktisk kurs .
Det viktigaste Àr noggrann förberedelse inför din intervju
Ja, innan vi börjar gÄ igenom uppgifterna, lÄt oss titta pÄ allmÀnna tips för att förbereda oss inför intervjun.
Det viktigaste Àr att förbereda sig i förvÀg. Kontrollera hur vÀl du minns algoritmer och datatyper, och förbÀttra dina kunskaper inom de omrÄden dÀr du inte Àr sÄ bekvÀm. Det finns mÄnga onlineplattformar som kan hjÀlpa till att förbereda sig för intervjuer. Vi rekommenderar , , och .
Det Àr bra att lÀra sig att prata högt om lösningen. Det Àr önskvÀrt att berÀtta för intervjuarna vad du gör, istÀllet för att bara skriva pÄ tavlan (eller skriva kod pÄ datorn, ocksÄ tyst). PÄ sÄ sÀtt, om du gör ett misstag i koden men tillvÀgagÄngssÀttet Àr generellt korrekt, kan du öka dina chanser att lyckas.
Uppgiften bör förstÄs innan du pÄbörjar lösningen. I vissa fall kan man bara fÄ en ytlig förstÄelse av uppgiften och sedan gÄ ner en felaktig vÀg. Det kan vara vÀrt att stÀlla nÄgra klargörande frÄgor till intervjuaren.
Det Àr nödvÀndigt att öva pÄ att skriva kod för hand, snarare Àn pÄ datorn. Det kan hÀnda att kandidaten pÄ intervjuer fÄr en markeringspenna och en tavla utan nÄgra ledtrÄdar eller automatisk formatering. NÀr du letar efter en lösning kan det vara bra att skriva ner din kod pÄ ett papper eller direkt pÄ tavlan. Om du försöker hÄlla allt i huvudet Àr det lÀtt att glömma nÄgot viktigt.
Standarduppgifter i JavaScript
Det Àr troligt att nÄgra av dessa uppgifter redan Àr bekanta för dig. Antingen har du genomgÄtt intervjuer dÀr du behövt lösa nÄgot liknande, eller sÄ har du övat pÄ dem under din JavaScript-utbildning. Nu Àr det dags att lösa dem igen, den hÀr gÄngen med en detaljerad förklaring av processen.
Palindrom
Ett palindrom Ă€r ett ord, en mening eller en sekvens av tecken som lĂ€ses exakt likadant bĂ„de framĂ„t och bakĂ„t. Till exempel Ă€r âAnnaâ ett palindrom, medan âtableâ och âJohnâ inte Ă€r det.
Problemformulering
Givet en strÀng; skriv en funktion som returnerar vÀrdet true om strÀngen Àr ett palindrom och false om den inte Àr det. TÀnk pÄ mellanslag och skiljetecken.
palindrome(âracecarâ) === true
palindrome(âtableâ) === false
LÄt oss analysera uppgiften
Huvudidén hÀr Àr att vÀnda strÀngen bakÄt. Om den 'omvÀnda' strÀngen Àr helt identisk med den ursprungliga, betyder det att vi har fÄtt ett palindrom och funktionen ska returnera vÀrdet true. Om inte, ska den returnera false.
Lösning
HÀr Àr koden som löser palindromproblemet.
const palindrome = str => {
// Gör om strÀngen till gemener
str = str.toLowerCase()
// VÀnd inputstrÀngen och returnera resultatet av
// jÀmförelsen
return str === str.split('').reverse().join('')
}Det första steget Àr att konvertera tecknen i den inmatade strÀngen till gemener. Detta sÀkerstÀller att programmet jÀmför sjÀlva tecknen, snarare Àn skalan eller nÄgot annat.
Det andra steget Àr att vÀnda strÀngen. Det Àr inte svÄrt: vi gör om den till en array med hjÀlp av metoden .split() (String-biblioteket). DÀrefter vÀnder vi arrayen med .reverse() (Array-biblioteket). Det sista steget Àr att omvandla den omvÀnda arrayen till en strÀng med .join() (Array-biblioteket).
Nu behöver vi bara jÀmföra den 'omvÀnda' strÀngen med den ursprungliga och returnera resultatet true eller false.
FizzBuzz
En av de mest populÀra uppgifterna pÄ intervjuer.
Problemformulering
Du ombeds skriva en funktion som skriver ut siffror frÄn 1 till n dÀr n Àr ett heltal som funktionen tar som parameter, med följande villkor:
- skriv ut fizz istÀllet för tal som Àr delbara med 3;
- utmatning av buzz istÀllet för tal som Àr delbara med 5;
- utmatning av fizzbuzz istÀllet för tal som Àr delbara med bÄde 3 och 5.
Exempel
Fizzbuzz(5)
Resultat
// 1
// 2
// fizz
// 4
// buzz
LÄt oss analysera uppgiften
Det viktigaste hĂ€r Ă€r metoden för att hitta delbara tal med hjĂ€lp av JavaScript. Detta kan Ă„stadkommas med hjĂ€lp av modulus- eller restoperatorn â %, som visar resten av divisionen av tvĂ„ tal. Om resten Ă€r 0 betyder det att det första talet Ă€r delbart med det andra.
12 % 5 // 2 -> 12 Àr inte delbart med 5
12 % 3 // 0 -> 12 Àr delbart med 3
SÄ, om vi delar 12 med 5, fÄr vi 2 med en rest pÄ 2. Om vi istÀllet delar 12 med 3, fÄr vi 4 med en rest pÄ 0. I det första fallet Àr 12 inte delbart med 5, medan det i det andra Àr 12 delbart med 3.
Lösning
Den optimala lösningen Àr följande kod:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// kontrollera om talet Àr delbart med 3 och 5
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // kontrollera om talet Àr delbart med 3
else if(i % 3 === 0) {
console.log('fizz')
} // kontrollera om talet Àr delbart med 5
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}Funktionen utför nödvĂ€ndiga kontroller med hjĂ€lp av villkorssatser och ger det resultat som anvĂ€ndaren behöver. I uppgiften bör man uppmĂ€rksamma ordningen pĂ„ ifâŠelse-satserna: börja med det dubbla villkoret (&&) och avsluta med fallet dĂ€r inga delbara tal hittas. PĂ„ sĂ„ sĂ€tt tĂ€cker vi alla alternativ.
Anagram
Det Àr ett ord som innehÄller alla bokstÀver av ett annat ord i samma antal, men i en annan ordning.
Problemformulering
Du behöver skriva en funktion som kontrollerar om tvÄ strÀngar Àr anagram, dÀr bokstÀvers fall inte spelar nÄgon roll. Endast tecken beaktas; mellanslag eller skiljetecken rÀknas inte med.
anagram('finder', 'Friend') -> true
anagram('hello', 'bye') -> false
LÄt oss analysera uppgiften
Det Àr viktigt att notera att man mÄste kontrollera varje bokstav i de tvÄ ingÄngsstrÀngarna och deras antal i varje strÀng.
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
För att lagra anagramdata Àr det bÀst att vÀlja en struktur som en JavaScript-objektnotering. Nyckeln i detta fall Àr bokstavens tecken, vÀrdet Àr antalet gÄnger den förekommer i den aktuella strÀngen.
Det finns ocksÄ andra villkor:
- Du mÄste se till att bokstavens fall inte beaktas vid jÀmförelsen. Omvandla helt enkelt bÄda strÀngarna till smÄ eller stora bokstÀver.
- Exkludera alla icke-tecken frÄn jÀmförelsen. Det Àr bÀst att arbeta 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
}Observera anvÀndningen av i snippetet ovan. Denna metod returnerar en array som innehÄller namn eller nycklar i samma ordning som de förekommer i objektet. I det hÀr fallet kommer arrayen att se ut sÄ hÀr:
[âfâ, âiâ, ânâ, âdâ, âeâ, ârâ]
PĂ„ sĂ„ sĂ€tt fĂ„r vi egenskaperna i objektet utan att behöva köra en stor loop. Denna metod kan anvĂ€ndas med egenskapen .length för att kontrollera om bĂ„da strĂ€ngarna har samma antal tecken â en viktig egenskap hos anagram.
Sök efter vokaler
En ganska enkel uppgift som ofta dyker upp vid anstÀllningsintervjuer.
Problemformulering
Du behöver skriva en funktion som tar en strÀng som argument och returnerar antalet vokaler som finns i strÀngen.
Vokalerna Àr "a", "e", "i", "o", "u".
Exempel:
findVowels(âhelloâ) // -> 2
findVowels(âwhyâ) // -> 0
Lösning
HÀr Àr det enklaste 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 Àr viktigt att notera anvÀndningen av metoden .includes(). Den finns tillgÀnglig bÄde för strÀngar och för arrayer. Den bör anvÀndas för att avgöra om en array innehÄller ett visst vÀrde. Denna metod returnerar true om arrayen innehÄller det angivna vÀrdet och false om den inte gör det.
Det finns en mer kompakt lösning pÄ problemet:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matched.length : 0
}HÀr anvÀnds metoden .match(), som möjliggör effektiv sökning. Om det reguljÀra uttrycket som argument för metoden finns inom den angivna strÀngen, dÄ blir returvÀrdet en array av matchande tecken. Om det inte finns nÄgra matchningar returnerar .match() null.
Fibonacci
En klassisk uppgift som man kan stöta pÄ vid intervjuer av olika nivÄer. Det Àr vÀrt att pÄminna om att Fibonacci-sekvensen Àr en rad av tal dÀr varje efterföljande Àr summan av de tvÄ föregÄende. SÄ hÀr ser de första tio talen ut: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Problemformulering
Du behöver skriva en funktion som returnerar det n:te vÀrdet i den specificerade sekvensen, dÀr n Àr ett tal som skickas som argument till funktionen.
fibonacci(3) // -> 2
Denna uppgift inkluderar att gÄ igenom en loop sÄ mÄnga gÄnger som anges i argumentet, med en ÄtergÄng till vÀrdet pÄ den aktuella positionen. Denna typ av problemstÀllning krÀver anvÀndning av loopar. Om du istÀllet anvÀnder rekursion kan det imponera pÄ intervjuaren och ge dig nÄgra extra poÀng.
Lösning
const fibonacci = num => {
// spara Fibonacci-sekvensen du ska generera
// i en array och
// initiera arrayen med de tvÄ första
// siffrorna i sekvensen
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// lÀgg till summan av de tvÄ siffrorna
// före positionen i i resultatarrayen
// i slutet av resultatarrayen
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// ÄtervÀnd den sista vÀrdet i resultatarrayen
return result[num]
}I resultatarrayen finns de första tvÄ siffrorna redan pÄ raden, eftersom varje post i sekvensen bestÄr av summan av de tvÄ föregÄende siffrorna. I början finns det inga tvÄ siffror som vi kan anvÀnda för att fÄ nÀsta nummer, sÄ loopen kan inte generera dem automatiskt. Men som vi vet Àr de tvÄ första siffrorna alltid 0 och 1. DÀrför kan resultatarrayen initialiseras manuellt.
NÀr det gÀller rekursion Àr det bÄde enklare och svÄrare pÄ en gÄng:
const fibonacci = num => {
// om num Àr antingen 0 eller 1 ÄtervÀnd num
if(num < 2) {
return num
}
// hÀr sker rekursion
return fibonacci(num - 1) + fibonacci(num - 2)
}Vi fortsÀtter att kalla fibonacci(), och skickar allt mindre siffror som argument. Vi stoppar nÀr det givna argumentet Àr 0 eller 1.
Utdata
Du har förmodligen redan stött pĂ„ nĂ„got av de angivna problemen om du har genomgĂ„tt intervjuer för frontend- eller JavaScript-utvecklare (sĂ€rskilt om det Ă€r nivĂ„ junior). Men om de inte har kommit upp kan de bli anvĂ€ndbara i framtiden â Ă„tminstone för allmĂ€nbildning.
Skillbox rekommenderar:
- TillÀmplig onlinekurs .
- Onlinekurs .
- Praktisk Ärskurs .
KĂ€lla: habr.com
