Swift auf LeetCode: Wo anfangen und wie man nicht aufgibt
Jeder iOS-Entwickler stößt früher oder später an eine Wand: Man erstellt Projekte, veröffentlicht Apps im AppStore, und im Vorstellungsgespräch bekommt man eine Aufgabe zu einem Binärbaum und ist völlig überfordert. Kommt Ihnen das bekannt vor? LeetCode ist genau der Trainingsplatz, der aus „Ich schreibe nur UI“ ein „Ich denke in Algorithmen“ macht. Aber es gibt einen Haken: Die meisten Lösungen im Internet sind in Python oder Java geschrieben, während Swift eine Sprache mit eigener Philosophie ist. In diesem Artikel werden wir uns ansehen, wie man LeetCode-Aufgaben effektiv genau in Swift löst, welche Datenstrukturen man verwendet und worauf man achten sollte, um keine Zeit zu verlieren.
Dieser Artikel richtet sich an diejenigen, die bereits die Grundlagen von Swift kennen, aber ihr algorithmisches Denken verbessern möchten. Wir werden keine Syntax lernen – wir werden lernen, zu denken.
Warum Swift eine ausgezeichnete Wahl für LeetCode ist
Viele denken, Swift sei nur UIKit und SwiftUI, aber tatsächlich bietet die Sprache leistungsstarke Möglichkeiten für algorithmische Aufgaben:
- Optionale Typen – sicheres Arbeiten mit nil ohne unerwartete Abstürze.
- Value Types (Strukturen) – vorhersagbares Kopieren, keine Überraschungen mit Referenzen.
- Faule Berechnungen und funktionale Ansätze – map, filter, reduce vereinfachen den Code erheblich.
- Geschwindigkeit – Swift wird in nativen Code kompiliert und ist oft 2-3 Mal schneller als Python.
Es gibt jedoch auch Fallstricke: Arrays in Swift sind beispielsweise Strukturen, und das Kopieren eines großen Arrays kann teuer sein. Aber dazu später mehr.
Datenstrukturen: Was man für Swift auf LeetCode wissen muss
Bevor Sie sich kopfüber in Aufgaben stürzen, stellen Sie sicher, dass Sie sicher mit den grundlegenden Datenstrukturen umgehen können. Hier ist eine Must-know-Liste für Swift:
Arrays und Slices (Array, ArraySlice)
Arrays in Swift sind nicht nur Listen, sondern leistungsstarke Strukturen mit O(1)-Zugriff über den Index. Aber Vorsicht: Einfügen/Löschen am Anfang ist O(n). Verwenden Sie ArraySlice, um Daten bei der Arbeit mit Unterarrays nicht zu kopieren.
let numbers = [1, 2, 3, 4, 5]let slice = numbers[1..<4] // ArraySlice, ohne Kopierenprint(slice) // [2, 3, 4]Wörterbücher und Mengen (Dictionary, Set)
Für Aufgaben zur Häufigkeitszählung, Duplikatsuche oder Zwei-Durchlauf-Algorithmen sind dies Ihre besten Freunde. Denken Sie daran: Dictionary ist eine Hash-Tabelle, im Durchschnitt O(1), kann aber bei schlechter Hash-Funktion auf O(n) degradieren.
func twoSum(_ nums: [Int], _ target: Int) -> [Int] { var dict = [Int: Int]() for (i, num) in nums.enumerated() { if let j = dict[target - num] { return [j, i] } dict[num] = i } return []}Stack und Queue (Stack, Queue)
In Swift gibt es keine eingebauten Stack- und Queue-Strukturen, aber sie lassen sich leicht mit einem Array emulieren. Für einen Stack – append und popLast. Für eine Queue verwenden Sie ArraySlice oder eine doppelt verkettete Liste, um O(n) beim Dequeue zu vermeiden.
struct Stack<T> { private var array = [T]() mutating func push(_ element: T) { array.append(element) } mutating func pop() -> T? { array.popLast() } var isEmpty: Bool { array.isEmpty }}Verkettete Listen (Linked List)
LeetCode liebt Aufgaben zu einfach verketteten Listen. In Swift gibt es keine eingebaute Implementierung, aber Sie können eine Klasse definieren:
class ListNode { var val: Int var next: ListNode? init(_ val: Int) { self.val = val; self.next = nil }}Dies ist ein Klassiker für Aufgaben zum Umdrehen einer Liste, Erkennen eines Zyklus oder Löschen eines Knotens.
Algorithmische Muster für Swift-Aufgaben
Um nicht jedes Mal das Rad neu zu erfinden, merken Sie sich einige Vorlagen, die 80% der LeetCode-Aufgaben abdecken.
Zwei Zeiger (Two Pointers)
I