题目
标题和出处
标题:学生出勤记录 I
难度
2 级
题目描述
要求
给定一个字符串 来代表一个学生的出勤记录,每个字符表示这个学生当前是缺勤、迟到或到场。记录仅包含以下三个字符:
:缺勤
:迟到
:到场
如果一个学生同时满足以下两个条件,则有资格获得出勤奖赏:
- 这个学生的缺勤(
)总数严格少于
天;
- 这个学生没有出现连续
天及以上的迟到(
)。
如果这个学生有资格获得出勤奖赏,返回 ,否则返回
。
示例
示例 1:
输入:
输出:
解释:学生的缺勤数少于 个并且没有
个及以上的连续的迟到。
示例 2:
输入:
输出:
解释:学生在最后 天连续迟到,所以不满足出勤奖励的条件。
数据范围
是
,
或
解法
思路和算法
如果一个学生有资格获得出勤奖赏,则需要同时满足两个条件,只需要分别检查这两个条件是否满足即可。
直观的解法是遍历字符串两次,第一次遍历检查缺勤总数是否满足条件,第二次遍历检查迟到情况是否满足条件。其实,可以在一次遍历中完成两个条件的检查。
一次遍历的做法是,维护两个变量分别记录缺勤总数和连续迟到天数,遍历过程中进行如下操作:
- 如果遇到
,则将连续迟到天数加
,否则将连续迟到天数清零;
- 如果遇到
,则将缺勤总数加
。
遍历过程中,只要出现缺勤总数达到 或者连续迟到天数达到
,无论是否遍历结束,该学生已经失去获得出勤奖赏的资格,因此返回
。
当遍历结束时,如果没有出现缺勤总数达到 或者连续迟到天数达到
,则该学生有资格获得出勤奖赏,返回
。
代码
class Solution {public boolean checkRecord(String s) {int absents = 0, continuousLates = 0;int length = s.length();for (int i = 0; i < length; i++) {char c = s.charAt(i);if (c == 'L') {continuousLates++;} else {if (c == 'A') {absents++;}continuousLates = 0;}if (absents >= 2 || continuousLates >= 3) {return false;}}return true;}}
复杂度分析
- 时间复杂度:
#card=math&code=O%28n%29&id=Q8Qhp),其中
是字符串
的长度。需要遍历字符串一次。
- 空间复杂度:
#card=math&code=O%281%29&id=lsvbR)。
