Menu
CoddyTech

最长连续打卡

本课属于 Coddy Swift 学习旅程的“逻辑与流程”单元。第 35 课,共 56 课。

连续记录是指连续多少天将某个习惯标记为已完成。对于日期 [1, 2, 3, 5, 6],最长连续记录为 3 天(第 1-3 天)。

得到排序后的日期列表后,只需进行一次简单的线性扫描:将每天与前一天比较,如果日期连续,就延长当前连续段;否则就重置。

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 在线编辑器