Najdłuższa seria
Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 35 z 56.
Seria to ciąg kolejnych dni, w których nawyk został oznaczony jako wykonany. Dla dni [1, 2, 3, 5, 6] najdłuższa seria wynosi 3 (dni 1-3).
Obliczenie tego po posortowaniu listy dni polega na prostym liniowym przeglądaniu: porównuj każdy dzień z poprzednim, wydłużając bieżącą serię, gdy dni są kolejne, a w przeciwnym razie ją resetuj.
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
}Wzorzec „śledź bieżącą serię i najlepszy wynik do tej pory” powraca w wielu zadaniach. Rozpoznaj go raz, a zostanie z tobą na zawsze.
Wyzwanie
ŚredniWczytaj jeden wiersz danych wejściowych: listę wpisów habit:day rozdzielonych przecinkami. Zbuduj ten sam słownik co w poprzedniej lekcji, a następnie dla każdego nawyku oblicz najdłuższą serię kolejnych dni w ciągu tygodnia.
Wypisz nawyki w kolejności alfabetycznej, po jednym w wierszu, w formacie:
<habit>: streak=<n>Dla danych wejściowych read:1,read:2,read:3,read:5,workout:2,workout:4 wynik to:
read: streak=3
workout: streak=1Spróbuj swoich sił
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: najdłuższa seria dla każdego nawyku, wypisz posortowane według nazwy w formacie 'name: streak=n'
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Logika i przepływ programu
1Dogłębnie o ciągach znaków
Liczba i indeksyWielkość liter i usuwanie białych znakówWyszukiwanie w ciągach znakówDzielenie i łączenieZastępowanie podciągówPodsumowanie — sprawdzanie nazwy użytkownika4Zbiory
Tworzenie zbiorówSuma i część wspólnaRóżnica i różnica symetrycznaPodzbiór i nadzbiórPowtórka — filtr tagów7Projekt – Śledzenie nawyków
Przegląd projektuOznacz jako wykonane10Projekt — silnik quizów
Przegląd projektuZadawanie pytań2Zakresy i kroki
Zakresy domknięte i półotwarteKrokMetody zakresówZakresy w instrukcji switchPowtórka — siatka kalendarza5Funkcje wyższego rzędu, część 1
MapFilterReduceŁączenie map, filter i reducePodsumowanie – statystyki słówPoćwicz samodzielnie: Edytor online Swift