Längste Serie
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy. Lektion 35 von 56.
Eine Serie ist eine Folge aufeinanderfolgender Tage, an denen eine Gewohnheit als erledigt markiert wurde. Für die Tage [1, 2, 3, 5, 6] beträgt die längste Serie 3 (Tage 1–3).
Sobald du eine sortierte day-Liste hast, ist die Berechnung ein einfacher linearer Durchlauf: Vergleiche jeden day mit dem vorherigen, erweitere den aktuellen run, wenn sie aufeinanderfolgend sind, und setze ihn andernfalls zurück.
func longestStreak(_ days: [Int]) -> Int {
let sorted = days.sorted()
var best = 0
var run = 0
var prev: Int? = nil
for d in sorted {
if let p = prev, d == p + 1 {
run += 1
} else {
run = 1
}
if run > best { best = run }
prev = d
}
return best
}Das Muster „aktuellen run verfolgen + best bisher“ tritt in vielen Problemen wieder auf. Erkenne es einmal, und es gehört für immer dir.
Aufgabe
MittelLies eine einzelne Eingabezeile ein: eine durch Kommas getrennte Liste von habit:day-Einträgen. Erstelle dasselbe Wörterbuch wie in der vorherigen Lektion und berechne dann für jede Gewohnheit die längste Folge aufeinanderfolgender Tage innerhalb der Woche.
Gib die Gewohnheiten in alphabetischer Reihenfolge aus, eine pro Zeile, im Format:
<habit>: streak=<n>Für die Eingabe read:1,read:2,read:3,read:5,workout:2,workout:4 lautet die Ausgabe:
read: streak=3
workout: streak=1Probier es selbst
var habits: [String: [Int]] = [:]
let ops = readLine()!.components(separatedBy: ",")
for op in ops {
let parts = op.components(separatedBy: ":")
let day = Int(parts[1])!
if !(habits[parts[0], default: []].contains(day)) {
habits[parts[0], default: []].append(day)
}
}
// TODO: längste Serie pro Gewohnheit, sortiert nach Name ausgeben als 'name: streak=n'
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimSuchen in StringsAufteilen und ZusammenfügenTeilstrings ersetzenRückblick – Benutzernamen prüfen4Mengen
Mengen erstellenVereinigung und SchnittmengeSubtraktion und symmetrische DifferenzTeilmenge und ObermengeWiederholung – Tag-Filter7Projekt – Gewohnheitstracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteBereichsmethodenBereiche in SwitchRückblick – Kalender-Raster5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerketten von Map, Filter und ReduceRückblick – WortstatistikÜbe selbstständig: Swift-Playground