5 häufige Interviewfragen zu JavaScript: Analysen und Lösungen

5 häufige Interviewfragen zu JavaScript: Analysen und Lösungen

Vom Übersetzer: haben wir einen Artikel veröffentlicht von Maria Perna, der typische Aufgaben im Zusammenhang mit JavaScript beschreibt, die häufig Bewerbern in Vorstellungsgesprächen angeboten werden. Der Artikel wird insbesondere für angehende Programmierer von Nutzen sein.

Vorstellungsgespräche in Technologieunternehmen sind längst zu einer Legende geworden. Es ist nicht erstaunlich — das erfolgreiche Bestehen eines Interviews eröffnet die Möglichkeit, einen guten Job zu bekommen. Aber es ist nicht ganz einfach, da oft komplexe Aufgaben zu lösen sind.

Dabei sind die meisten dieser Aufgaben häufig nicht mit der Arbeit verbunden, die der Bewerber ausführen wird, aber sie müssen dennoch gelöst werden. Manchmal muss dies an der Tafel geschehen, ohne Rückgriff auf Google oder andere Quellen. Ja, die Situation ändert sich allmählich, und einige Unternehmen verzichten auf solche Vorstellungsgespräche, aber viele Arbeitgeber halten immer noch an dieser Tradition fest. Dieser Artikel widmet sich den typischen JavaScript-Aufgaben, die häufig als Aufgaben für Bewerber verwendet werden.

Wir erinnern daran: alle Leser von „Habr“ erhalten einen Rabatt von 10.000 Rubel bei der Anmeldung zu einem beliebigen Kurs von Skillbox mit dem Aktionscode „Habr“.

Skillbox empfiehlt: Praktischer Kurs „Mobile Entwickler PRO“.

Das Wichtigste ist eine gründliche Vorbereitung auf Ihr Vorstellungsgespräch.

Ja, bevor wir mit den Aufgaben beginnen, lassen Sie uns einige allgemeine Tipps zur Vorbereitung auf das Interview betrachten.

Es ist wichtig, sich im Voraus vorzubereiten. Überprüfen Sie, wie gut Sie die Algorithmen und Datenstrukturen beherrschen, und frischen Sie Ihr Wissen in den Bereichen auf, die Ihnen nicht so gut bekannt sind. Es gibt zahlreiche Online-Plattformen, die Ihnen bei der Vorbereitung auf Vorstellungsgespräche helfen können. Wir empfehlen GeeksforGeeks, Pramp, Interviewing.io und CodeSignal.

Es lohnt sich, die Lösungen laut auszusprechen. Es ist ratsam, den Angefragten zu erklären, was Sie tun, anstatt nur an die Tafel zu schreiben (oder still am Computer zu coden). So können Sie Ihre Chancen auf Erfolg erhöhen, auch wenn es im Code einen Fehler gibt, aber der Lösungsansatz im Großen und Ganzen richtig ist.

Die Aufgabe sollte durchdacht werden, bevor Sie mit der Lösung beginnen. In einigen Fällen kann man die Aufgabe nur oberflächlich erfassen und dann den falschen Weg einschlagen. Es kann sinnvoll sein, einige klärende Fragen an den Interviewer zu stellen.

Sie sollten üben, Code von Hand zu schreiben, anstatt am PC. Es kommt vor, dass bei Vorstellungsgesprächen den Bewerbern ein Marker und eine Tafel gegeben werden, auf der keine Hinweise oder automatische Formatierungen vorhanden sind. Bei der Lösung des Problems kann es hilfreich sein, den eigenen Code auf einem Blatt Papier oder direkt auf der Tafel zu notieren. Wenn man alles im Kopf behält, vergisst man möglicherweise etwas Wichtiges.

Vorlagenaufgaben in JavaScript

Einige dieser Aufgaben sind Ihnen wahrscheinlich bereits bekannt. Entweder haben Sie Vorstellungsgespräche geführt, bei denen Sie etwas Ähnliches lösen mussten, oder Sie haben während Ihres JavaScript-Studiums geübt. Jetzt ist es an der Zeit, sie erneut zu lösen, diesmal jedoch mit einer detaillierten Erklärung des Prozesses.

Palindrom

Ein Palindrom ist ein Wort, ein Satz oder eine Zeichenfolge, die sowohl vorwärts als auch rückwärts exakt gleich gelesen wird. Zum Beispiel ist „Anna“ ein Palindrom, während „Tisch“ und „Johann“ es nicht sind.

Aufgabenstellung

Gegeben ist eine Zeichenfolge; Sie müssen eine Funktion schreiben, die den Wert true zurückgibt, wenn die Zeichenfolge ein Palindrom ist, und false, wenn dies nicht der Fall ist. Dabei sind Leerzeichen und Interpunktion zu berücksichtigen.

palindrome('racecar') === true
palindrome('table') === false

Wir analysieren die Aufgabe

Die Grundidee hier ist, den String in umgekehrter Reihenfolge auszugeben. Wenn der "umgekehrte" String identisch mit dem ursprünglichen ist, haben wir ein Palindrom, und die Funktion sollte den Wert true zurückgeben. Andernfalls false.

Lösung

Hier ist der Code, der das Palindromproblem löst.

const palindrome = str => {
  // Wandle den String in Kleinbuchstaben um
  str = str.toLowerCase()
  // Kehre den Eingabestring um und gebe das Ergebnis der
  // Vergleich zurück
  return str === str.split('').reverse().join('')
}

Der erste Schritt ist die Umwandlung der Zeichen im Eingabestring in Kleinbuchstaben. Das gewährleistet, dass das Programm tatsächlich die Zeichen und nicht die Groß- oder Kleinschreibung vergleicht.

Der zweite Schritt ist das Umkehren des Strings. Das ist nicht schwer: Wir müssen ihn in ein Array umwandeln, indem wir die Methode .split() (String-Bibliothek) verwenden. Dann kehren wir das Array um, indem wir .reverse() (Array-Bibliothek) verwenden. Der letzte Schritt besteht darin, das umgekehrte Array mit .join() (Array-Bibliothek) in einen String umzuwandeln.

Jetzt müssen wir nur den "umgekehrten" String mit dem ursprünglichen vergleichen und das Ergebnis true oder false zurückgeben.

FizzBuzz

Eine der bekanntesten Fragen in Vorstellungsgesprächen.

Aufgabenstellung

Es muss eine Funktion geschrieben werden, die die Zahlen von 1 bis n in die Konsole ausgibt, wobei n eine ganze Zahl ist, die als Parameter an die Funktion übergeben wird, unter den folgenden Bedingungen:

  • Gib 'fizz' anstelle der Zahlen aus, die durch 3 teilbar sind;
  • Gib 'buzz' anstelle der Zahlen aus, die durch 5 teilbar sind;
  • Gib 'fizzbuzz' anstelle der Zahlen aus, die sowohl durch 3 als auch durch 5 teilbar sind.

Beispiel

Fizzbuzz(5)

Ergebnis

// 1
// 2
// fizz
// 4
// buzz

Wir analysieren die Aufgabe

Hier ist die Hauptmethode zur Ermittlung der Teilbarkeit von Zahlen mit JavaScript. Diese kann mit dem Modulo-Operator oder dem Rest — % — implementiert werden, der den Rest bei der Division von zwei Zahlen anzeigt. Wenn der Rest 0 ist, bedeutet das, dass die erste Zahl durch die zweite teilbar ist.

12 % 5 // 2 -> 12 ist nicht durch 5 teilbar
12 % 3 // 0 -> 12 ist durch 3 teilbar

Wenn man also 12 durch 5 teilt, erhält man 2 mit einem Rest von 2. Teilt man 12 durch 3, erhält man 4 mit einem Rest von 0. Im ersten Fall ist 12 nicht durch 5 teilbar, im zweiten Fall ist 12 durch 3 teilbar.

Lösung

Die optimale Lösung ist der folgende Code:

const fizzBuzz = num => {
  for(let i = 1; i <= num; i++) {
    // prüfe, ob die Zahl durch 3 und 5 teilbar ist
    if(i % 3 === 0 && i % 5 === 0) {
      console.log('fizzbuzz')
    } // prüfe, ob die Zahl durch 3 teilbar ist
      else if(i % 3 === 0) {
      console.log('fizz')
    } // prüfe, ob die Zahl durch 5 teilbar ist
      else if(i % 5 === 0) {
      console.log('buzz')
    } else {
      console.log(i)
    }
  }
}

Die Funktion führt die erforderlichen Prüfungen mithilfe von bedingten Anweisungen durch und gibt das Ergebnis zurück, das der Benutzer benötigt. Bei dieser Aufgabe sollte der Reihenfolge der if…else-Anweisungen besondere Aufmerksamkeit geschenkt werden: Beginnen Sie mit der doppelten Bedingung (&&) und enden Sie mit dem Fall, in dem keine Vielfachen gefunden wurden. So decken wir alle Möglichkeiten ab.

Anagramm

So nennt man ein Wort, das alle Buchstaben eines anderen Wortes in der gleichen Anzahl, jedoch in einer anderen Reihenfolge enthält.

Aufgabenstellung

Es muss eine Funktion geschrieben werden, die überprüft, ob zwei Zeichenfolgen Anagramme sind, wobei die Groß- und Kleinschreibung keine Rolle spielt. Nur Zeichen werden berücksichtigt; Leerzeichen oder Satzzeichen zählen nicht.

anagram(‘finder’, ‘Friend’) —> true
anagram(‘hello’, ‘bye’) —> false

Wir analysieren die Aufgabe

Hier ist es wichtig zu beachten, dass jede Zahl in den beiden Eingabezeichenfolgen und deren Anzahl in jeder Zeichenfolge überprüft werden müssen.

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

Um die Daten eines Anagramms zu speichern, sollte eine Struktur wie ein JavaScript-Objektliteral gewählt werden. Der Schlüssel in diesem Fall ist das Zeichen des Buchstabens, der Wert ist die Anzahl seiner Wiederholungen in der aktuellen Zeichenfolge.

Es gibt auch weitere Bedingungen:

  • Es muss sichergestellt werden, dass die Groß-/Kleinschreibung bei Vergleichen nicht berücksichtigt wird. Wir wandeln beide Strings einfach in die gleiche Groß- oder Kleinschreibung um.
  • Alle Nicht-Zeichen aus dem Vergleich ausschließen. Am besten funktioniert dies mit Regulären Ausdrücken.

Lösung

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

Beachten Sie die Verwendung von Object.keys() im obigen Snippet. Diese Methode gibt ein Array zurück, das die Namen oder Schlüssel in der Reihenfolge enthält, in der sie im Objekt vorkommen. In diesem Fall wird das Array so aussehen:

[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]

So erhalten wir die Eigenschaften des Objekts, ohne eine umfangreiche Schleife ausführen zu müssen. In dieser Aufgabe kann diese Methode mit der Eigenschaft .length verwendet werden – um zu überprüfen, ob beide Strings die gleiche Anzahl von Zeichen haben – dies ist eine wichtige Eigenschaft von Anagrammen.

Vokale suchen

Eine ziemlich einfache Aufgabe, die oft in Bewerbungsgesprächen vorkommt.

Aufgabenstellung

Sie müssen eine Funktion schreiben, die einen String als Argument annimmt und die Anzahl der Vokale zurückgibt, die im String enthalten sind.
Die Vokale sind „a“, „e“, „i“, „o“, „u“.

Beispiel:

findVowels(‘hello’) // -> 2
findVowels(‘why’) // -> 0

Lösung

Hier ist die einfachste Variante:

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
}

Es ist wichtig, auf die Verwendung der Methode .includes() hinzuweisen. Diese ist sowohl für Strings als auch für Arrays verfügbar. Sie sollte verwendet werden, um zu überprüfen, ob ein Array einen bestimmten Wert enthält. Diese Methode gibt true zurück, wenn das Array den angegebenen Wert enthält, und false, wenn nicht.

Es gibt auch eine kürzere Lösung für das Problem:

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

Hier wird die Methode .match() verwendet, die eine effiziente Suche ermöglicht. Wenn das reguläre Ausdrucksargument in dem angegebenen String gefunden wird, gibt es ein Array von übereinstimmenden Zeichen zurück. Wenn es keine Übereinstimmungen gibt, gibt .match() null zurück.

Fibonacci

Eine klassische Aufgabe, die in Vorstellungsgesprächen auf verschiedenen Niveaus vorkommen kann. Es sei daran erinnert, dass die Fibonacci-Folge eine Reihe von Zahlen ist, bei der jede folgende Zahl die Summe der beiden vorhergehenden ist. Die ersten zehn Zahlen lauten daher: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.

Aufgabenstellung

Sie müssen eine Funktion schreiben, die den n-ten Wert einer bestimmten Sequenz zurückgibt, wobei n die Zahl ist, die als Argument an die Funktion übergeben wird.

fibonacci(3) // -> 2

Diese Aufgabe beinhaltet das Durchlaufen einer Schleife so oft, wie es im Argument angegeben ist, und das Zurückgeben des Wertes an der entsprechenden Position. Diese Aufgabenstellung erfordert die Verwendung von Schleifen. Wenn Sie stattdessen Rekursion verwenden, könnte dies dem Interviewer gefallen und Ihnen einige zusätzliche Punkte einbringen.

Lösung

const fibonacci = num => {
  // speichern Sie die Fibonacci-Serie, die Sie
  // generieren möchten, in einem Array und
  // initialisieren Sie das Array mit den ersten beiden
  // Zahlen der Sequenz
  const result = [0, 1]

  for(let i = 2; i <= num; i++) {
    // fügen Sie die Summe der beiden Zahlen
    // vor der Position i im Ergebnisarray
    // am Ende des Ergebnisarrays hinzu
    const prevNum1 = result[i - 1]
    const prevNum2 = result[i - 2]
    result.push(prevNum1 + prevNum2)
  }
  // geben Sie den letzten Wert im Ergebnisarray zurück
  return result[num]
}

In dem Ergebnisarray sind die ersten beiden Zahlen in der Reihe enthalten, da jeder Eintrag in der Sequenz aus der Summe der beiden vorhergehenden Zahlen besteht. Zu Beginn gibt es jedoch keine zwei Zahlen, die man nehmen könnte, um die nächste Zahl zu erhalten. Daher kann der Zyklus sie nicht automatisch generieren. Aber wie wir wissen, sind die ersten beiden Zahlen immer 0 und 1. Deshalb kann das Ergebnisarray manuell initialisiert werden.

Was die Rekursion betrifft, so ist es hier gleichzeitig einfacher und komplizierter:

const fibonacci = num => {
  // wenn num entweder 0 oder 1 ist, gib num zurück
  if(num < 2) {
    return num
  }
  // hier ist die Rekursion
  return fibonacci(num - 1) + fibonacci(num - 2)
}

Wir rufen fibonacci() weiterhin auf, indem wir immer kleinere Zahlen als Argumente übergeben und stoppen, wenn das übergebene Argument 0 oder 1 ist.

Fazit

Wahrscheinlich sind Ihnen bereits einige der genannten Aufgaben begegnet, wenn Sie Vorstellungsgespräche für eine Stelle als Frontend- oder JavaScript-Entwickler geführt haben (insbesondere auf Junior-Level). Aber selbst wenn Sie ihnen nicht begegnet sind, können sie in Zukunft nützlich sein — mindestens zur allgemeinen Weiterbildung.

Skillbox empfiehlt:

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster