5 typiska JavaScript-intervjuuppgifter: analys och lösningar

5 typiska JavaScript-intervjuuppgifter: analys och lösningar

Från översättaren: publicerade en artikel åt dig Maria Antonietta Perna, som berättar om vanliga JavaScript-uppgifter, oftast erbjuds utvecklarsökande under intervjuer. Artikeln kommer först och främst att vara användbar för nybörjare.

Intervjuer med teknikföretag har länge varit samtalsämne. Detta borde inte vara förvånande - att klara en intervju ger dig möjligheten att få ett bra jobb. Men detta är inte så enkelt, eftersom komplexa problem ofta måste lösas.

Dessutom är de flesta av dessa uppgifter oftast inte relaterade till det arbete som den sökande kommer att utföra, men de måste fortfarande lösas. Ibland måste du göra det på tavlan, utan att kolla med Google eller någon annan källa. Ja, situationen förändras gradvis, och vissa företag överger sådana intervjuer, men många arbetsgivare håller fortfarande fast vid denna tradition. Den här artikeln ägnas åt analys av typiska JavaScript-uppgifter som ofta används som uppgifter för arbetssökande.

Påminnelse: för alla läsare av "Habr" - en rabatt på 10 000 rubel när du anmäler dig till någon Skillbox-kurs med hjälp av "Habr"-kampanjkoden.

Skillbox rekommenderar: Praktisk kurs "Mobilutvecklare PRO".

Det viktigaste är att noggrant förbereda sig för din intervju.

Ja, innan vi börjar titta på uppgifterna, låt oss titta på några allmänna tips för intervjuförberedelser.

Det viktigaste är att förbereda sig i förväg. Testa hur väl du kommer ihåg algoritmer och datastrukturer, och förbättra dina kunskaper inom områden som du inte är så bekant med. Det finns många onlineplattformar som kan hjälpa dig att förbereda dig för intervjuer. Vi råder geeksforgeeks, Barnvagn, Intervju.io и Kodsignal.

Det är värt att lära sig att säga beslutet högt. Det är lämpligt att berätta för sökande om vad du gör, och inte bara skriva på tavlan (eller skriva in kod i datorn, även tyst). På så sätt kan du öka dina chanser att lyckas om du gör ett misstag i koden, men lösningen är generellt korrekt.

Du måste förstå problemet innan du börjar lösa det. I vissa fall kan du förstå en uppgift ytligt och sedan gå in på fel väg. Det kan vara värt att ställa några klargörande frågor till intervjuaren.

Du måste träna på att skriva kod för hand, inte på en PC. Det händer att den sökande under intervjuer får en markör och en whiteboard, där det inte finns några tips eller automatisk formatering. När du letar efter en lösning är det värt att skriva ner din kod på ett papper eller direkt på tavlan. Om du håller allt i huvudet kanske du glömmer något viktigt.

Malluppgifter i JavaScript

Vissa av dessa uppgifter är förmodligen redan bekanta för dig. Du har antingen haft intervjuer där du behövt lösa något liknande, eller tränat på dem medan du lärde dig JavaScript. Nåväl, nu är det dags att lösa dem igen, och 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 i den vanliga riktningen och i motsatt riktning. Till exempel är "Anna" ett palindrom, men "bord" och "John" är det inte.

produktion

Givet en sträng; du måste skriva en funktion som låter dig returnera sant om strängen är en palindrom, och falsk om inte. I det här fallet måste du ta hänsyn till mellanslag och skiljetecken.

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

Låt oss analysera uppgiften

Huvudtanken här är att vända strängen. Om den "omvända" strängen är helt identisk med den ursprungliga, så har vi fått ett palindrom och funktionen bör returnera sant. Om inte, falskt.

beslutet

Här är koden som löser palindromen.

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örsta steget är att konvertera tecknen i inmatningssträngen till gemener. Detta är en garanti för att programmet kommer att jämföra karaktärerna själva, och inte case eller något annat.

Det andra steget är att vända linjen. Detta är inte svårt att göra: du måste konvertera den till en array med metoden .split() (String library). Sedan vänder vi arrayen med .reverse() (Array-bibliotek). Det sista steget är att konvertera den omvända arrayen till en sträng med .join() (Array-bibliotek).

Allt du behöver göra nu är att jämföra den "omvända" strängen med den ursprungliga strängen och returnera resultatet sant eller falskt.

FizzBuzz

En av de mest populära uppgifterna i intervjuer.

produktion

Du måste skriva en funktion som skriver ut siffror från 1 till n till konsolen, där n är ett heltal som funktionen tar som en parameter, med följande villkor:

  • utgång brus istället för multiplar av 3;
  • mata ut buzz istället för siffror som är multiplar av 5;
  • fizzbuzz-utdata istället för tal som är multiplar av både 3 och 5.

Exempel

Fizzbuzz(5)

Resultat

// 1
// 2
// brus
// 4
//surr

Låt oss analysera uppgiften

Huvudsaken här är ett sätt att hitta multiplar med JavaScript. Det kan implementeras med hjälp av moduloperatorn eller resten - %, vilket gör att du kan visa resten när du delar två tal. Om resten är 0 betyder det att det första talet är en multipel av det andra.

12% 5 // 2 -> 12 är inte en multipel av 5
12% 3 // 0 -> 12 är multipel av 3

Så om du dividerar 12 med 5 får du 2 med resten av 2. Om du dividerar 12 med 3 får du 4 med resten av 0. I det första fallet är 12 inte en multipel av 5, i det andra , 12 är en multipel av 3.

beslutet

Den optimala lösningen skulle vara följande kod:

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 utför de nödvändiga kontrollerna med hjälp av villkorliga uttalanden och producerar det resultat som krävs av användaren. I problemet är det värt att uppmärksamma ordningen på if...else-satserna: börja med ett dubbelt villkor (&&) och sluta med fallet där flera tal inte kunde hittas. Som ett resultat täcker vi alla alternativ.

Anagram

Detta är namnet på ett ord som innehåller alla bokstäverna i ett annat ord i samma nummer, men i en annan ordning.

produktion

Vi måste skriva en funktion som kontrollerar om två strängar är anagram, och fallet spelar ingen roll. Endast tecken räknas; mellanslag eller skiljetecken beaktas inte.

anagram('finder', 'Vän') —> sant
anagram('hej', 'hejdå') —> falskt

Låt oss analysera uppgiften

Det viktiga att tänka på här är att du måste kontrollera varje bokstav i de två inmatningsraderna och deras nummer på varje rad.

hitta —> f: 1 vän —> 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 bör du välja en struktur som ett bokstavligt JavaScript-objekt. Nyckeln i det här fallet är bokstavens karaktär, värdet är antalet repetitioner i den aktuella raden.

Det finns andra villkor:

  • Du måste se till att fallet med bokstäver inte beaktas när du jämför. Vi konverterar helt enkelt båda strängarna till gemener eller versaler.
  • Vi utesluter alla icke-tecken från jämförelsen. Bäst att jobba med vanliga uttryck.

beslutet

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

Var uppmärksam på användningen Object.keys () i utdraget ovan. Denna metod returnerar en array som innehåller namn eller nycklar i samma ordning som de visas 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 objektets egenskaper utan att behöva göra en bulkslinga. I ett problem kan du använda den här metoden med egenskapen .length för att kontrollera om båda strängarna har samma antal tecken - detta är en viktig egenskap hos anagram.

Sök efter vokaler

En ganska enkel uppgift som ofta dyker upp i intervjuer.

produktion

Du måste skriva en funktion som tar en sträng som ett argument och returnerar antalet vokaler som finns i strängen.
Vokalerna är "a", "e", "i", "o", "u".

Exempel:

findVokels('hej') // —> 2
findVokels('varför') // —> 0

beslutet

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 vara uppmärksam på användningen av metoden .includes(). Den är tillgänglig för både strängar och 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 matrisen innehåller det angivna värdet och false om den inte gör det.

Det finns en kortare lösning på problemet:

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

Detta använder metoden .match(), som låter dig implementera en effektiv sökning. Om ett reguljärt uttryck som metodargument hittas inuti den angivna strängen är returvärdet en matris med matchande tecken. Tja, om det inte finns några matchningar, returnerar .match() null.

Fibonacci

En klassisk uppgift som finns i intervjuer på olika nivåer. Det är värt att komma ihåg att Fibonacci-sekvensen är en serie tal där varje efterföljande är summan av de två föregående. Så de första tio siffrorna ser ut så här: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

produktion

Du måste skriva en funktion som returnerar den n:e posten i en viss sekvens, där n är talet som skickas som argument till funktionen.

fibonacci(3) // —> 2

Den här uppgiften innebär att gå genom en slinga det antal gånger som anges i argumentet, och returnera värdet till lämplig position. Detta sätt att ställa problemet kräver användning av slingor. Om du istället använder rekursion kan det göra intervjuaren nöjd och ge dig några extra poäng.

beslutet

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 finns de två första talen i serien eftersom varje post i sekvensen är summan av de två föregående talen. I början finns det inga två nummer som kan tas 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 du initialisera resultatmatrisen manuellt.

När det gäller rekursion är allt enklare och mer komplicerat på samma gång:

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 fortsätter att anropa fibonacci(), och skickar mindre och mindre tal som argument. Vi slutar när det godkända argumentet är 0 eller 1.

Utgång

Troligtvis har du redan stött på någon av dessa uppgifter om du har blivit intervjuad för ett frontend- eller JavaScript-utvecklarjobb (särskilt om det är på juniornivå). Men om du inte har stött på dem kan de vara användbara i framtiden - åtminstone för allmän utveckling.

Skillbox rekommenderar:

Källa: will.com

Lägg en kommentar