„Schreiben Sie eine JavaScript-Funktion, mit der Sie einen eingegebenen String S umdrehen können, also z. B. 'abcdef' zu 'fedcba'.“
Diesen (oder einen ähnlichen) Satz hört man nicht selten, wenn man sich um einen Job als JavaScript-Entwickler bewirbt. Da ein Coding-Interview für gewöhnlich eine Stresssituation ist, ist es ratsam, sich mit potentiellen programmiertechnischen Fragestellungen bereits im Vorfeld zu beschäftigen, um diese Situation meistern und den Arbeitgeber von sich überzeugen zu können. Deshalb bekommst du hier nicht eine, auch nicht zwei, sondern ganze fünf (!) Möglichkeiten gezeigt, wie du diese Herausforderung meistern kannst. Beachte, dass dein zukünftiger Arbeitgeber mit solchen Fragen nicht wissen will, ob du programmieren kannst, sondern wie gut (d. h. effizient, vollständig und generisch) du die Aufgabe löst.
Variante 1: Split, Reverse und Join
Die erste Variante verwendet die eingebauten Funktionen split( ), reverse( ) und join( ). Da reverse( ) nur auf Arrays anwendbar ist, wird zunächst auf dem umzudrehenden String to_reverse die Funktion split aufgerufen, die ein Array mit den Zeichen der im String enthaltenen Character erstellt. Anschließend werden die Elemente dieses Array mit reverse( ) umgedreht und mit join( ) wieder in der neuen Reihenfolge zu einem String zusammengesetzt.
function reverse(to_reverse){
return to_reverse.split("").reverse().join("");
}
Variante 2: For-Schleife
Es spricht übrigens auch nichts gegen die gute alte for-Schleife. Dabei durchläufst du jede Stelle in dem umzukehrenden String von hinten nach vorne und fügst das entsprechend gelesene Zeichen hinten an den Ergebnis-String (hier result) an:
function reverse(to_reverse){
let result = "";
for (var pos = to_reverse.length - 1; pos >= 0; pos--){
result += to_reverse[pos];
}
return result;
}
Hierbei handelt es sich um die Variante, die vermutlich von den meisten als erstes vorgeschlagen wird. Deshalb ist es umso besser, wenn du dich durch eine der nächsten von deinen Konkurrenten abheben kannst.
Variante 3: Reduce
Für die Anwendung der reduce( )-Funktion wird ein Array benötigt, weshalb hier erneut zuerst die Funktion split( ) auf dem umzudrehenden String aufgerufen wird. reduce( ) reduziert ein Array auf einen einzigen Wert und erhält als Eingabe zwei Elemente, die durch eine bestimmte Funktion (hier definiert nach dem Pfeil-Operator) miteinander verarbeitet werden. In diesem Fall werden die eingegebenen Elemente umgekehrt kombiniert:
function reverse(to_reduce){
return to_reduce.split("").reduce( (accumulator, current_char) => current_char + accumulator, '');
}
Zugegeben, diese Lösung ist eher für die Showoffs gedacht. Dein potentieller Arbeitgeber kann das auch negativ interpretieren, doch der Erfindungsreichtum dieser Lösung sollte ihn eigentlich darüber hinwegsehen lassen.
Variante 4: Spread Syntax (ECMAScript 6)
Diese Lösungsvariante verwendet die Spread-Syntax von „JavaScript 6“. Diese erlaubt es einen String an Stellen zu expandieren, an denen null oder mehr Argumente erwartet werden. D. h. der umzukehrende String wird in ein Array umgewandelt, das aus allen Zeichen des Strings besteht. Dieses wird anschließend mit der Funktion reverse( ) (siehe Variante 1) umgedreht und mit join( ) wieder zu einem String zusammengesetzt.
function reverse(to_reverse){
return [...to_reverse].reverse().join("");
}
Variante 5: RekursionHier gibt es sogar gleich zwei Notationsmöglichkeiten. Die erste prüft, ob der eingegebene String leer ("") ist und gibt diesen bei true zurück. Andernfalls ruft die Funktion sich rekursiv auf wobei der Input der zuvor aufgerufene String ab dem zweiten Zeichen ist. Das führende (erste) Zeichen bei der Rückgabe ans Ende angefügt.
function reverse(to_reverse){
if(to_reverse == ""){
return to_reverse;
} else {
return reverse(to_reverse.substr(1)) + to_reverse[0];
}
}
Bei der zweiten Variante kommt der „Elvis-Operator“ ?: zum Einsatz. So gesehen handelt es sich hierbei also nicht um eine weitere Lösungsmöglichkeit, sondern wirklich nur um eine andere Darstellung:
function reverse(to_reverse){
return to_reverse == "" ? to_reverse : reverse(to_reverse.substr(1)) + to_reverse[0];
}
Autor: Florian André Dalwigk
Dieser Artikel hat 50 Bonuspunkte erhalten. Schreib auch du einen Artikel.