Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Średni

Wczytaj 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=1

Spró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'
quiz iconSprawdź się

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

Poćwicz samodzielnie: Edytor online Swift