„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Typescript Coding Chronicles: String-Komprimierung

Typescript Coding Chronicles: String-Komprimierung

Veröffentlicht am 23.08.2024
Durchsuche:367

Typescript Coding Chronicles: String Compression

Problemstellung:

Komprimieren Sie ein gegebenes Array von Zeichen mit dem folgenden Algorithmus:

  • Beginnen Sie mit einer leeren Zeichenfolge s.
  • Für jede Gruppe aufeinanderfolgender sich wiederholender Zeichen in Zeichen:
    • Wenn die Gruppenlänge 1 beträgt, hängen Sie das Zeichen an s an.
    • Andernfalls fügen Sie das Zeichen gefolgt von der Länge der Gruppe hinzu.

Die komprimierte Zeichenfolge s sollte nicht separat zurückgegeben werden, sondern im Eingabezeichen-Array chars gespeichert werden. Beachten Sie, dass Gruppenlängen von 10 oder mehr in chars in mehrere Zeichen aufgeteilt werden.

Nachdem Sie mit der Änderung des Eingabearrays fertig sind, geben Sie die neue Länge des Arrays zurück.

Sie müssen einen Algorithmus schreiben, der nur konstanten zusätzlichen Speicherplatz verwendet.

Beispiel 1:

  • Eingabe: chars = ["a", "a", "b", "b", "c", "c", "c"]
  • Ausgabe: Gibt 6 zurück, und die ersten 6 Zeichen des Eingabearrays sollten sein: ["a", "2", "b", "2", "c", "3"]
  • Erläuterung: Die Gruppen sind „aa“, „bb“ und „ccc“. Dies wird zu „a2b2c3“ komprimiert.

Beispiel 2:

  • Eingabe: chars = ["a"]
  • Ausgabe: Gibt 1 zurück, und das erste Zeichen des Eingabearrays sollte sein: ["a"]
  • Erklärung: Die einzige Gruppe ist „a“, die unkomprimiert bleibt, da es sich um ein einzelnes Zeichen handelt.

Beispiel 3:

  • Eingabe: chars = ["a", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b". ","b","b"]
  • Ausgabe: Gibt 4 zurück, und die ersten 4 Zeichen des Eingabearrays sollten sein: ["a", "b", "1", "2"]
  • Erläuterung: Die Gruppen sind „a“ und „bbbbbbbbbbbb“. Dies wird auf „ab12“ komprimiert.

Einschränkungen:

  • 1
  • chars[i] ist ein englischer Kleinbuchstabe, ein englischer Großbuchstabe, eine Ziffer oder ein Symbol.

Erster Denkprozess:

Um dieses Problem zu lösen, müssen wir das Array durchlaufen und dabei das aktuelle Zeichen und seine Anzahl im Auge behalten. Wenn wir auf ein neues Zeichen stoßen, hängen wir das aktuelle Zeichen und seine Anzahl (falls größer als 1) an das Array an. Wir müssen sicherstellen, dass wir dies vor Ort tun, um den Anforderungen an die Platzkomplexität gerecht zu werden.

Grundlegende Lösung (Brute Force):

Die Brute-Force-Lösung beinhaltet die Erstellung eines neuen Arrays zum Speichern der komprimierten Version des Eingabearrays. Dies ist nicht platzsparend, hilft uns aber, die erforderlichen Schritte zu verstehen.

Code:

function compressBruteForce(chars: string[]): number {
    const n = chars.length;
    let compressed: string[] = [];
    let i = 0;

    while (i  1) {
            compressed.push(...count.toString().split(''));
        }
    }

    for (let j = 0; j 



Zeitkomplexitätsanalyse:

  • Zeitkomplexität: O(n), wobei n die Länge des Arrays ist. Wir durchlaufen das Array einmal, um Zeichen zu zählen, und einmal, um das Ergebnis zu schreiben.
  • Speicherplatzkomplexität: O(n), da wir zusätzlichen Speicherplatz für das komprimierte Array verwenden.

Einschränkungen:

Die Brute-Force-Lösung ist nicht platzsparend und erfüllt nicht die Einschränkung, nur konstanten zusätzlichen Speicherplatz zu verwenden.

Optimierte Lösung:

Die optimierte Lösung besteht darin, das Eingabearray an Ort und Stelle zu ändern, um die komprimierte Version zu speichern. Wir verwenden zwei Zeiger: einen zum Lesen des Eingabearrays und einen zum Schreiben der komprimierten Ausgabe.

Code:

function compress(chars: string[]): number {
    let writeIndex = 0;
    let i = 0;

    while (i  1) {
            let countStr = count.toString();
            for (let j = 0; j 



Zeitkomplexitätsanalyse:

  • Zeitkomplexität: O(n), wobei n die Länge des Arrays ist. Wir durchlaufen das Array einmal, um Zeichen zu zählen, und einmal, um das Ergebnis zu schreiben.
  • Raumkomplexität: O(1), da wir nur eine konstante Menge zusätzlichen Raums für Variablen verwenden.

Verbesserungen gegenüber der Basislösung:

  • Die optimierte Lösung reduziert die Platzkomplexität auf O(1), indem sie das Eingabearray an Ort und Stelle ändert.

Randfälle und Tests:

Randfälle:

  1. Das Array enthält nur ein Zeichen.
  2. Das Array enthält keine aufeinanderfolgenden sich wiederholenden Zeichen.
  3. Das Array enthält eine große Anzahl aufeinanderfolgender sich wiederholender Zeichen.

Testfälle:

console.log(compressBruteForce(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"]
console.log(compressBruteForce(["a"])); // 1, ["a"]
console.log(compressBruteForce(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"]
console.log(compressBruteForce(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"]
console.log(compressBruteForce(["a","b","c"])); // 3, ["a","b","c"]

console.log(compress(["a","a","b","b","c","c","c"])); // 6, ["a","2","b","2","c","3"]
console.log(compress(["a"])); // 1, ["a"]
console.log(compress(["a","b","b","b","b","b","b","b","b","b","b","b","b"])); // 4, ["a","b","1","2"]
console.log(compress(["a","a","a","a","a","a","a","a","a","a"])); // 3, ["a","1","0"]
console.log(compress(["a","b","c"])); // 3, ["a","b","c"]

Allgemeine Problemlösungsstrategien:

  1. Verstehen Sie das Problem: Lesen Sie die Problemstellung sorgfältig durch, um die Anforderungen und Einschränkungen zu verstehen.
  2. Schlüsseloperationen identifizieren: Bestimmen Sie die erforderlichen Schlüsseloperationen, z. B. das Zählen aufeinanderfolgender Zeichen und das Ändern des Arrays an Ort und Stelle.
  3. Optimierung für Effizienz: Nutzen Sie effiziente Algorithmen und Datenstrukturen, um die zeitliche und räumliche Komplexität zu minimieren.
  4. Gründlich testen: Testen Sie die Lösung mit verschiedenen Fällen, einschließlich Randfällen, um die Richtigkeit sicherzustellen.

Identifizieren ähnlicher Probleme:

  1. String-Manipulation:

    • Probleme, bei denen Sie Zeichenfolgen basierend auf bestimmten Bedingungen ändern müssen.
    • Beispiel: Duplikate aus einer Zeichenfolge entfernen.
  2. In-Place-Algorithmen:

    • Probleme, bei denen Vorgänge vor Ort mit begrenztem zusätzlichen Platz ausgeführt werden müssen.
    • Beispiel: Elemente aus einem Array ohne zusätzlichen Platz entfernen.

Abschluss:

  • Das Problem der Komprimierung eines Zeichenarrays kann sowohl mit einem Brute-Force-Ansatz als auch mit einem optimierten In-Place-Ansatz effizient gelöst werden.
  • Es ist entscheidend, das Problem zu verstehen und es in überschaubare Teile zu zerlegen.
  • Die Verwendung effizienter Algorithmen stellt sicher, dass die Lösung für große Eingaben optimal ist.
  • Testen mit verschiedenen Randfällen gewährleistet Robustheit.
  • Das Erkennen von Mustern in Problemen kann dabei helfen, ähnliche Lösungen auf andere Herausforderungen anzuwenden.

Durch das Üben solcher Probleme und Strategien können Sie Ihre Fähigkeiten zur Problemlösung verbessern und besser auf verschiedene Codierungsherausforderungen vorbereitet sein.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/__zamora__/typescript-coding-chronicles-string-compression-42k5?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3