【力扣】551. 学生出勤记录 I

128 阅读1分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

原题链接

551. 学生出勤记录 I

题目描述

给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:

'A':Absent,缺勤
'L':Late,迟到
'P':Present,到场

如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:

按 总出勤 计,学生缺勤('A')严格 少于两天。
学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。

如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。

测试用例

示例 1:

输入:s = "PPALLP"
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。

示例 2:

输入:s = "PPALLL"
输出:false
解释:学生最后三天连续迟到,所以不满足出勤奖励的条件。

参数限制

  • 1 <= s.length <= 1000
  • s[i]'A''L''P'

分析

转化为容易理解的意思,有一个字符串,当一下两个条件都满足时,返回 true

  1. A 的数量小于 2
  2. 不存在连续超过 3 个(包括3)的 L

代码

直接挨个遍历字符,对 AL 添加状态标记,每次遍历的时候都去检查一下这些状态是否超过界限

var checkRecord = function(s) {
    let a = 2;
    let l = 3;
    let flag = true;
    for (let i = 0; i < s.length; i++) {
        let c = s.charAt(i);
        if (c == 'L') {
            if (l-- == 0) flag = false;
        } else {
            l = 3;
            if (c == 'A' && a-- == 0) flag = false;
        }
        if (!flag) break;
    }
    return flag;
};

image.png

解法 2

换个思路,只要字符串首和尾找到的 A 下标不相等则表示存在有 2 个及以上的 A

如果字符串中含有3个及以上的 L,那么起码可以说明会有 LLL,代码可以简化为如下,最差情况下完整遍历 2 次字符串

var checkRecord = function(s) {
    return !(s.indexOf('LLL') > -1 || s.indexOf('A') != s.lastIndexOf('A'));
};

今天的力扣刷题就分享到这里,感谢大家的阅读~