最长连续打卡
本课属于 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
}“记录当前连续次数 + 迄今为止的最佳成绩”这种模式会在很多问题中反复出现。认出一次,就能一直掌握它。
挑战
中等读取一行输入:由逗号分隔的 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' 格式输出
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
逻辑与流程中的所有课
自己练习: Swift 在线编辑器