
Von dem Übersetzer: Wir haben einen Artikel für Sie veröffentlicht , die häufig von Bewerbern für Entwickler in Vorstellungsgesprächen angeboten werden. Der Artikel wird insbesondere für Anfänger in der Programmierung nützlich sein.
Vorstellungsgespräche in Technologieunternehmen sind längst zu einer Redewendung geworden. Es ist nicht verwunderlich, denn das erfolgreiche Bestehen eines Interviews ermöglicht es, einen guten Job zu bekommen. Aber es ist nicht so einfach, da oft komplexe Aufgaben gelöst werden müssen.
Außerdem haben die meisten dieser Aufgaben meist nichts mit der Arbeit zu tun, die der Bewerber ausführen wird, aber sie müssen trotzdem gelöst werden. Manchmal ist es erforderlich, dies an einer Tafel zu tun, ohne sich auf Google oder eine andere Quelle zu beziehen. 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 ist der Analyse typischer JavaScript-Aufgaben gewidmet, die häufig als Übungen 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 durchgehen.
Das Wichtigste ist, sich im Voraus vorzubereiten. Überprüfen Sie, wie gut Sie sich an Algorithmen und Datenstrukturen erinnern, und frischen Sie Ihr Wissen in den Bereichen auf, die Ihnen nicht so gut bekannt sind. Es gibt viele Online-Plattformen, die Ihnen helfen, sich auf Vorstellungsgespräche vorzubereiten. Wir empfehlen , , und .
Es ist wichtig, zu lernen, die Lösung laut auszusprechen. Es ist ratsam, den Bewerbern zu erklären, was Sie tun, anstatt einfach nur an der Tafel zu schreiben (oder still am Computer zu programmieren). Auf diese Weise kann, wenn es einen Fehler im Code gibt, aber der Lösungsansatz im Großen und Ganzen richtig ist, Ihre Erfolgschance erhöht werden.
Die Aufgabe muss überlegt werden, bevor man mit der Lösung beginnt. In einigen Fällen kann man die Aufgabe oberflächlich erfassen und dann auf den falschen Weg gehen. Möglicherweise ist es sinnvoll, dem Interviewer einige klärende Fragen zu stellen.
Sie sollten üben, Code von Hand zu schreiben, nicht am PC. Es kommt vor, dass Bewerber in Vorstellungsgesprächen einen Marker und ein Whiteboard bekommen, ohne Hinweise oder automatische Formatierung. Bei der Lösung des Problems sollte man seinen Code auf Papier oder direkt auf dem Whiteboard festhalten. Wenn man alles im Kopf behält, kann man etwas Wichtiges vergessen.
Vorlagenaufgaben in JavaScript
Wahrscheinlich sind einige dieser Aufgaben Ihnen bereits bekannt. Sie haben entweder Vorstellungsgespräche geführt, in denen Sie etwas Ähnliches lösen mussten, oder haben während des Lernens von JavaScript dafür geübt. Jetzt ist es an der Zeit, sie noch einmal zu lösen, und zwar mit einer ausführlichen Erklärung des Prozesses.
Palindrom
Ein Palindrom ist ein Wort, ein Satz oder eine Zeichenfolge, die vorwärts und rückwärts identisch gelesen wird. Zum Beispiel ist „Anna“ ein Palindrom, während „table“ und „John“ es nicht sind.
Aufgabenstellung
Gegeben ist ein String; Sie müssen eine Funktion schreiben, die true zurückgibt, wenn der String ein Palindrom ist, und false, wenn nicht. Dabei sind Leerzeichen und Satzzeichen zu berücksichtigen.
palindrome(‘racecar’) === true
palindrome(‘table’) === false
Lösung des Problems
Die Hauptidee ist hier, den String umzukehren. Wenn der «umgekehrte» String vollständig identisch mit dem ursprünglichen ist, haben wir ein Palindrom, und die Funktion sollte true zurückgeben. Andernfalls false.
Lösung
Hier ist der Code, der das Palindrom löst.
const palindrome = str => {
// Wandle den String in Kleinbuchstaben um
str = str.toLowerCase()
// Wende die Umkehrung des Eingabestrings an und gib das Ergebnis der
// Vergleiche zurück
return str === str.split('').reverse().join('')
}Der erste Schritt besteht darin, die Zeichen des Eingabestrings in Kleinbuchstaben umzuwandeln. Das gewährleistet, dass das Programm genau die Zeichen vergleicht und nicht die Groß- oder Kleinschreibung oder etwas anderes.
Der zweite Schritt ist die Umkehrung des Strings. Das ist nicht schwierig: Man muss ihn mittels der Methode .split() in ein Array umwandeln (String-Bibliothek). Dann kehren wir das Array mit .reverse() um (Array-Bibliothek). Der letzte Schritt besteht darin, das umgekehrte Array mit .join() (Array-Bibliothek) wieder in einen String zu verwandeln.
Jetzt muss nur noch der «umgekehrte» String mit dem ursprünglichen verglichen werden, um das Ergebnis true oder false zurückzugeben.
FizzBuzz
Eine der populärsten Aufgaben in Vorstellungsgesprächen.
Aufgabenstellung
Es soll eine Funktion geschrieben werden, die die Zahlen von 1 bis n in die Konsole ausgibt, wobei n eine ganze Zahl ist, die die Funktion als Parameter empfängt, mit den folgenden Bedingungen:
- Ausgabe von fizz anstelle der Zahlen, die durch 3 teilbar sind;
- Ausgabe von buzz anstelle von Zahlen, die durch 5 teilbar sind;
- Ausgabe von fizzbuzz anstelle von Zahlen, die sowohl durch 3 als auch durch 5 teilbar sind.
Beispiel
Fizzbuzz(5)
Ergebnis
// 1
// 2
// fizz
// 4
// buzz
Lösung des Problems
Das Wichtigste hier ist die Methode zur Suche nach Vielfachen mit JavaScript. Dies kann mit dem Modulo-Operator oder dem Restoperator – % – durchgeführt werden, der den Rest bei der Division zweier Zahlen anzeigt. Wenn der Rest 0 ist, bedeutet dies, dass die erste Zahl durch die zweite teilbar ist.
12 % 5 // 2 -> 12 ist kein Vielfaches von 5
12 % 3 // 0 -> 12 ist ein Vielfaches von 3
Wenn man 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 wird durch den folgenden Code dargestellt:
const fizzBuzz = num => {
for(let i = 1; i <= num; i++) {
// überprüfen, ob die Zahl ein Vielfaches von 3 und 5 ist
if(i % 3 === 0 && i % 5 === 0) {
console.log('fizzbuzz')
} // überprüfen, ob die Zahl ein Vielfaches von 3 ist
else if(i % 3 === 0) {
console.log('fizz')
} // überprüfen, ob die Zahl ein Vielfaches von 5 ist
else if(i % 5 === 0) {
console.log('buzz')
} else {
console.log(i)
}
}
}Die Funktion führt die erforderlichen Überprüfungen unter Verwendung von bedingten Operatoren durch und gibt das Ergebnis zurück, das der Benutzer benötigt. Bei der Aufgabe sollte man auf die Reihenfolge der if…else-Anweisungen achten: Beginne mit der doppelten Bedingung (&&) und beende mit dem Fall, in dem keine Vielfachen gefunden wurden. Damit decken wir alle Möglichkeiten ab.
Anagramm
So bezeichnet man ein Wort, das alle Buchstaben eines anderen Wortes in derselben Anzahl, jedoch in anderer Reihenfolge enthält.
Aufgabenstellung
Es muss eine Funktion geschrieben werden, die überprüft, ob zwei Strings Anagramme sind, wobei die Groß- und Kleinschreibung der Buchstaben keine Rolle spielt. Nur Zeichen werden berücksichtigt; Leerzeichen oder Satzzeichen werden nicht gewertet.
anagram('finder', 'Friend') -> true
anagram('hello', 'bye') -> false
Lösung des Problems
Hier ist es wichtig zu beachten, dass jede Buchstabe in den beiden Eingabestrings und deren Anzahl in jedem String ü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
Zur Speicherung der Anagrammdaten sollte eine Struktur wie das objektliterale JavaScript gewählt werden. Der Schlüssel ist in diesem Fall das Zeichen des Buchstabens, der Wert ist die Anzahl seiner Wiederholungen im aktuellen String.
Es gibt auch andere Bedingungen:
- Es muss sichergestellt werden, dass die Groß- und Kleinschreibung der Buchstaben beim Vergleich nicht berücksichtigt wird. Einfach beide Strings in Klein- oder Großbuchstaben umwandeln.
- Alle Nicht-Zeichen werden aus dem Vergleich ausgeschlossen. Am besten arbeitet man 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 derselben Reihenfolge enthält, in der sie im Objekt erscheinen. In diesem Fall sieht das Array so aus:
[‘f’, ‘i’, ‘n’, ‘d’, ‘e’, ‘r’]
So erhalten wir die Eigenschaften des Objekts, ohne einen aufwendigen Zyklus durchführen zu müssen. In der Aufgabe kann diese Methode mit der Eigenschaft .length verwendet werden, um zu überprüfen, ob beide Strings die gleiche Anzahl von Zeichen enthalten – das ist eine wichtige Eigenschaft von Anagrammen.
Vokale finden
Eine ziemlich einfache Aufgabe, die oft in Vorstellungsgesprächen vorkommt.
Aufgabenstellung
Es muss eine Funktion geschrieben werden, die einen String als Argument akzeptiert 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() zu achten. Sie steht sowohl für Strings als auch für Arrays zur Verfügung. 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 des Problems:
const findVowels = str => {
const matched = str.match(/[aeiou]/gi)
return matched ? matches.length : 0
}Hier wird die Methode .match() verwendet, die eine effiziente Suche ermöglicht. Wenn das reguläre Ausdruck-Argument in dem angegebenen String gefunden wird, wird ein Array der übereinstimmenden Zeichen zurückgegeben. Wenn es keine Übereinstimmungen gibt, gibt .match() null zurück.
Fibonacci
Eine klassische Aufgabe, die auf Vorstellungsgesprächen unterschiedlicher Niveaus vorkommen kann. Es ist wichtig, sich daran zu erinnern, dass die Fibonacci-Folge eine Reihe von Zahlen ist, wobei jede folgende die Summe der zwei vorhergehenden ist. Die ersten zehn Zahlen sehen wie folgt aus: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34.
Aufgabenstellung
Es muss eine Funktion geschrieben werden, die den n-ten Eintrag in der bestimmten Folge zurückgibt, wobei n die Zahl ist, die als Argument in die Funktion übergeben wird.
fibonacci(3) // —> 2
Diese Aufgabe umfasst das Durchlaufen einer Schleife so oft, wie im Argument angegeben, mit Rückgabe des Wertes an der entsprechenden Position. Diese Art der Aufgabestellung erfordert die Verwendung von Schleifen. Wenn Sie stattdessen Rekursion verwenden, könnte das dem Interviewer gefallen und Ihnen einige zusätzliche Punkte einbringen.
Lösung
const fibonacci = num => {
// speichere die Fibonacci-Folge in einem Array und
// initialisiere das Array mit den ersten beiden
// Zahlen der Folge
const result = [0, 1]
for(let i = 2; i <= num; i++) {
// füge die Summe der beiden Zahlen hinzu
// die der Position von i im Ergebnis-Array
// am Ende des Ergebnis-Arrays vorausgehen
const prevNum1 = result[i - 1]
const prevNum2 = result[i - 2]
result.push(prevNum1 + prevNum2)
}
// gib den letzten Wert im Ergebnis-Array zurück
return result[num]
}Im Ergebnis-Array befinden sich die ersten beiden Zahlen in der Reihe, da jeder Eintrag in der Folge aus der Summe der beiden vorhergehenden Zahlen besteht. Ganz am Anfang gibt es jedoch keine zwei Zahlen, die man zur Erzeugung der nächsten Zahl nehmen kann, weshalb die Schleife sie nicht automatisch generieren kann. Aber wie wir wissen, sind die ersten beiden Zahlen immer 0 und 1. Daher kann man das Ergebnis-Array manuell initialisieren.
Was die Rekursion betrifft, so ist es hier einfacher und gleichzeitig komplizierter:
const fibonacci = num => {
// wenn num entweder 0 oder 1 ist, gib num zurück
if(num < 2) {
return num
}
// Rekursion hier
return fibonacci(num - 1) + fibonacci(num - 2)
}Wir rufen weiterhin fibonacci() auf und übergeben dabei immer kleinere Zahlen als Argumente. Wir stoppen, wenn das übergebene Argument 0 oder 1 ist.
Ausgabe
Wahrscheinlich sind Sie bereits mit einer der genannten Aufgaben konfrontiert worden, wenn Sie Vorstellungsgespräche für Frontend- oder JavaScript-Entwickler geführt haben (insbesondere, wenn es sich um eine Junior-Position handelt). Aber selbst wenn Sie ihnen nicht begegnet sind, könnten sie in Zukunft nützlich sein – zumindest für ihre allgemeine Entwicklung.
Skillbox empfiehlt:
- Angewandter Online-Kurs .
- Online-Kurs .
- Praktischer Jahreskurs .
Quelle: habr.com
