Menu
Coddy logo textTech

Самая длинная серия

Часть раздела Логика и управление потоком путешествия по Swift на Coddy. Урок 35 из 56.

streak — это последовательность идущих подряд дней, в которые привычка была отмечена как выполненная. Для дней [1, 2, 3, 5, 6] самая длинная последовательность составляет 3 (дни 1–3).

После получения отсортированного списка day вычислить это можно с помощью простого линейного прохода: сравнивайте каждый day с предыдущим, продолжая текущую серию, если они идут подряд, а в противном случае сбрасывайте её.

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
}

Шаблон «отслеживать текущую серию + лучший результат на данный момент» встречается во многих задачах. Распознайте его один раз — и он навсегда станет вашим.

challenge icon

Задание

Средне

Прочитай одну строку ввода: список записей habit:day, разделённых запятыми. Построй тот же словарь, что и на предыдущем уроке, затем для каждой привычки вычисли самую длинную серию последовательных дней в течение недели.

Выведи привычки в алфавитном порядке, по одной в строке, в формате:

<habit>: streak=<n>

Для ввода read:1,read:2,read:3,read:5,workout:2,workout:4 вывод будет таким:

read: streak=3
workout: streak=1

Попробуйте сами

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: самая длинная серия для каждой привычки, вывести отсортированные по имени как 'name: streak=n'
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Песочница Swift