
Vom Übersetzer: haben wir einen Artikel veröffentlicht , 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 .
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 , , und .
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 .
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 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:
- Angewandter Online-Kurs .
- Online-Kurs .
- Praktischer Jahreskurs .
Quelle: habr.com
