Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Backspaces in string |
Level: | 6 kyu |
Sprache: | TypeScript |
Beschreibung:
Assume "#"
is like a backspace in string. This means that string "a#bc#d"
actually is "bd"
Your task is to process a string with "#"
symbols.
Examples
"abc#d##c" ==> "ac"
"abc##d######" ==> ""
"#######" ==> ""
"" ==> ""
Quelle: codewars.com
Lösung
Pseudo-Code
Wie immer gibt's reichlich Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Als erstes drehen wir den Input-String um.
Schritt 2
Dann loopen wir durch alle Zeichen.
Schritt 3
Wenn das aktuelle Zeichen ein #
ist, erhöhen wir einen Zähler um 1
und entfernen das #
.
Schritt 4
Ansonsten prüfen wir den #
-Zähler.
Schritt 5
Wenn der #
-Zähler positiv ist, entfernen wir das Zeichen und prüfen das nächste.
Schritt 6
Ansonsten fügen wir das Zeichen an den Anfang einer Output-Variablen.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function cleanString(s: string): string {
Dann erstellen wir uns zuerst unseren Zähler und die Output-Variable:
let backspaceCount = 0;
let output = "";
Als nächstes wandeln wir den Input-String in ein Array, drehen es um und speichern es in einer Variablen:
const reversedChars = s.split("").reverse();
Dann der Loop durch alle Zeichen:
for (let char of reversedChars) {
Wenn das aktuelle Zeichen ein #
ist, erhöhen wir unseren Zähler um 1
und gehen zum nächsten:
if (char === "#") {
backspaceCount++;
continue;
}
Dann prüfen wir, ob unser Zähler positiv
ist. Wenn ja, verringern wir unseren Zähler um 1
und gehen zur nächsten Iteration:
if (backspaceCount > 0) {
backspaceCount--;
continue;
}
Wenn beides nicht zutrifft, können wir das aktuelle Zeichen an den Anfang unseres Outputs setzen:
output = char + output;
}
Nach dem Loop nur noch unsere Output-Variable zurückgeben:
return output;
}
Voilá! 💪
Komplettlösung
export function cleanString(s: string): string {
let backspaceCount = 0;
let output = "";
const reversedChars = s.split("").reverse();
for (let char of reversedChars) {
if (char === "#") {
backspaceCount++;
continue;
}
if (backspaceCount > 0) {
backspaceCount--;
continue;
}
output = char + output;
}
return output;
}