题目

标题和出处

标题:学生出勤记录 I

出处:551. 学生出勤记录 I

难度

2 级

题目描述

要求

给定一个字符串 字符串题目:学生出勤记录 I - 图1 来代表一个学生的出勤记录,每个字符表示这个学生当前是缺勤、迟到或到场。记录仅包含以下三个字符:

  • 字符串题目:学生出勤记录 I - 图2:缺勤
  • 字符串题目:学生出勤记录 I - 图3:迟到
  • 字符串题目:学生出勤记录 I - 图4:到场

如果一个学生同时满足以下两个条件,则有资格获得出勤奖赏:

  • 这个学生的缺勤(字符串题目:学生出勤记录 I - 图5)总数严格少于 字符串题目:学生出勤记录 I - 图6 天;
  • 这个学生没有出现连续 字符串题目:学生出勤记录 I - 图7 天及以上的迟到(字符串题目:学生出勤记录 I - 图8)。

如果这个学生有资格获得出勤奖赏,返回 字符串题目:学生出勤记录 I - 图9,否则返回 字符串题目:学生出勤记录 I - 图10

示例

示例 1:

输入:字符串题目:学生出勤记录 I - 图11
输出:字符串题目:学生出勤记录 I - 图12
解释:学生的缺勤数少于 字符串题目:学生出勤记录 I - 图13 个并且没有 字符串题目:学生出勤记录 I - 图14 个及以上的连续的迟到。

示例 2:

输入:字符串题目:学生出勤记录 I - 图15
输出:字符串题目:学生出勤记录 I - 图16
解释:学生在最后 字符串题目:学生出勤记录 I - 图17 天连续迟到,所以不满足出勤奖励的条件。

数据范围

  • 字符串题目:学生出勤记录 I - 图18
  • 字符串题目:学生出勤记录 I - 图19字符串题目:学生出勤记录 I - 图20字符串题目:学生出勤记录 I - 图21字符串题目:学生出勤记录 I - 图22

解法

思路和算法

如果一个学生有资格获得出勤奖赏,则需要同时满足两个条件,只需要分别检查这两个条件是否满足即可。

直观的解法是遍历字符串两次,第一次遍历检查缺勤总数是否满足条件,第二次遍历检查迟到情况是否满足条件。其实,可以在一次遍历中完成两个条件的检查。

一次遍历的做法是,维护两个变量分别记录缺勤总数和连续迟到天数,遍历过程中进行如下操作:

  • 如果遇到 字符串题目:学生出勤记录 I - 图23,则将连续迟到天数加 字符串题目:学生出勤记录 I - 图24,否则将连续迟到天数清零;
  • 如果遇到 字符串题目:学生出勤记录 I - 图25,则将缺勤总数加 字符串题目:学生出勤记录 I - 图26

遍历过程中,只要出现缺勤总数达到 字符串题目:学生出勤记录 I - 图27 或者连续迟到天数达到 字符串题目:学生出勤记录 I - 图28,无论是否遍历结束,该学生已经失去获得出勤奖赏的资格,因此返回 字符串题目:学生出勤记录 I - 图29

当遍历结束时,如果没有出现缺勤总数达到 字符串题目:学生出勤记录 I - 图30 或者连续迟到天数达到 字符串题目:学生出勤记录 I - 图31,则该学生有资格获得出勤奖赏,返回 字符串题目:学生出勤记录 I - 图32

代码

  1. class Solution {
  2. public boolean checkRecord(String s) {
  3. int absents = 0, continuousLates = 0;
  4. int length = s.length();
  5. for (int i = 0; i < length; i++) {
  6. char c = s.charAt(i);
  7. if (c == 'L') {
  8. continuousLates++;
  9. } else {
  10. if (c == 'A') {
  11. absents++;
  12. }
  13. continuousLates = 0;
  14. }
  15. if (absents >= 2 || continuousLates >= 3) {
  16. return false;
  17. }
  18. }
  19. return true;
  20. }
  21. }

复杂度分析

  • 时间复杂度:字符串题目:学生出勤记录 I - 图33#card=math&code=O%28n%29&id=Q8Qhp),其中 字符串题目:学生出勤记录 I - 图34 是字符串 字符串题目:学生出勤记录 I - 图35 的长度。需要遍历字符串一次。
  • 空间复杂度:字符串题目:学生出勤记录 I - 图36#card=math&code=O%281%29&id=lsvbR)。