Codewars Lösung | Backspaces in string


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|30. September 2023
3 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

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á! 💪

Fragen?

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

Feedback

Schreib mir!