Leetcode Problem 26: Duplikate aus sortiertem Array entfernen

7/3/2024

Summary

Eine JavaScript-Lösung für LeetCodes "Remove Duplicates"-Problem, die die Entwicklung vom initialen Ansatz zur finalen Implementierung zeigt, mit Erklärungen der aufgetretenen Bugs und den unterwegs entdeckten Lösungen.

Einführung

Hey, vor zwei Wochen begann ich, täglich LeetCode-Probleme zu lösen, um meine Programmier- und Problemlösungsfähigkeiten zu entwickeln. Ich wählte JavaScript, meine vertrauteste Sprache, für diese Herausforderungen. Heute löste ich das Problem 26: Remove Duplicates from Sorted Array.

Problem

Gegeben ist ein sortiertes Array von Zahlen. Das Ziel ist es, alle duplizierten Zahlen aus dem Array zu entfernen, sodass am Ende das Array keine Duplikate mehr enthält. Zum Beispiel, wenn du das Array eingibst: nums=[1,1,2], sollte die finale Ausgabe [1,2] sein.

Lösung

1) Struktur

Zunächst haben wir eine Funktion "removeDuplicates" mit einem Array "nums" als Parameter gegeben.
removeDuplicates = function(nums{

}

2) Grundidee

Mein Ansatz zur Lösung dieses Problems beinhaltet das Iterieren über das Array und das Vergleichen jedes Werts von nums[i] mit dem nachfolgenden Wert von nums[i+1]. Dann verwende ich ein if-else-Statement, um diese zwei Werte zu vergleichen, und wenn beide gleich sind, entferne ich den Wert von nums[i].

3) Erste Implementierung

var removeDuplicates = function(nums{
for(let i=0; i<nums.length; i++){
if(nums[i]===nums[i+1]){
delete nums[i];
};
};
Dieser Ansatz führte jedoch zu einem Problem, bei dem nur der Wert entfernt wurde und ein leerer Platz im Array zurückblieb. Folglich erschien die Ausgabe als [,1,2], was inkorrekt ist, da die erwartete Ausgabe [1,2] sein sollte.

4) Erster Bug behoben

Also, was ist die Lösung? Nachdem ich auf das Problem mit der delete-Methode gestoßen war, entschied ich mich für einen anderen Ansatz, um den Wert von nums[i] zu entfernen. Ich fand heraus, dass die Nutzung der splice-Methode es mir erlaubte, das gesamte Element aus dem Array zu entfernen. So sah es aus, wenn es im Code implementiert wurde:
var removeDuplicates = function(nums{
for(let i=0; i<nums.length; i++){
if(nums[i]===nums[i+1]){
nums.splice(i, 1);
};
};

5) Finaler Bug behoben

Schließlich entdeckte ich einen verbleibenden Bug. Nach dem Einreichen der Lösung bei LeetCode erhielt ich Feedback, dass für die Eingabe nums=[1,1,1] die Funktion das Array [1,1] ausgab, was inkorrekt war, da immer noch Duplikate vorhanden waren.
Bei der Untersuchung realisierte ich, dass die Funktion nur richtig funktionierte, wenn es höchstens zwei Vorkommen derselben Zahl im Array gab. Dies lag daran, dass die for-Schleife vom aktuellen Index i iterierte, anstatt vom Anfang des Arrays. In unserem Beispiel mit [1,1,1] verglich sie die erste 1 mit der zweiten 1, entfernte einen Wert und resultierte im Array [1,1]. Jedoch verglich sie, anstatt beide 1en zu vergleichen, die zweite 1 mit dem nächsten Wert, der leer war. Folglich gab sie [1,1] zurück, aber die korrekte Ausgabe hätte [1] sein sollen.
Um dieses Problem zu lösen, musste ich den Wert von i auf i-1 setzen, nachdem ich einen Wert gelöscht hatte. Auf diese Weise würde, wenn ein Wert gelöscht wurde, die Schleife vom nächsten Wert fortfahren, aber bei dem davor.
Die finale Implementierung des Codes sieht so aus:
var removeDuplicates = function(nums{
for(let i=0; i<nums.length; i++){
if(nums[i]===nums[i+1]){
nums.splice(i, 1);
i=-1
};
};

Abschließende Worte

Wenn du Fragen oder Anmerkungen hast, kontaktiere mich gerne.
Mario :D