持续创造,加速成长!这是我参与「日新计划 10 月更文挑战」的第30天,点击查看活动详情
题目
给你一个字符串 s
表示一个学生的出勤记载,其间的每个字符用来标记当天的出勤状况(矿工、迟到、参与)。记载中只含下面三种字符:
-
'A'
:Absent,矿工 -
'L'
:Late,迟到 -
'P'
:Present,参与
假如学生可以 同时 满意下面两个条件,则可以获得出勤奖赏:
- 按 总出勤 计,学生矿工(
'A'
)严厉 少于两天。 - 学生 不会 存在 接连 3 天或 接连 3 天以上的迟到(
'L'
)记载。
假如学生可以获得出勤奖赏,回来 true
;不然,回来 false
。
示例 1:
- 输入:
s = "PPALLP"
- 输出:
true
- 解说: 学生矿工次数少于 2 次,且不存在 3 天或以上的接连迟到记载。
示例 2:
- 输入:
s = "PPALLL"
- 输出:
false
- 解说: 学生最终三天接连迟到,所以不满意出勤奖赏的条件。
方法一:一次遍历
思路及解法
可奖赏的出勤记载要求矿工次数少于 2 和接连迟到次数少于 3。判别出勤记载是否可奖赏,只需求遍历出勤记载,判别这两个条件是否同时满意即可。
遍历过程中,记载矿工次数和接连迟到次数,依据遍历到的字符更新矿工次数和接连迟到次数:
-
假如遇到 ‘A’\text{`A’},即矿工,则将矿工次数加 1,不然矿工次数不变;
-
假如遇到 ‘L’\text{`L’},即迟到,则将接连迟到次数加 1,不然将接连迟到次数清零。
假如在更新矿工次数和接连迟到次数之后,呈现矿工次数大于或等于 2 或者接连迟到次数大于或等于 3,则该出勤记载不满意可奖赏的要求,回来 false\text{false}。假如遍历结束时未呈现出勤记载不满意可奖赏的要求的状况,则回来 true\text{true}。
代码
class Solution {
func checkRecord(_ s: String) -> Bool {
var absents: Int = 0
var lates: Int = 0
for ch: Character in s {
if ch == "A" {
absents += 1
if absents > 1 {
return false
}
}
if ch == "L" {
lates += 1
if lates > 2 {
return false
}
} else {
lates = 0
}
}
return true
}
}
复杂度分析
-
时间复杂度:O(n)O(n),其间 nn 是字符串 ss 的长度。需求遍历字符串 ss 一次。
-
空间复杂度:O(1)O(1)。