小知识,大挑战!本文正在参与「程序员必备小知识」创作活动
原题链接
题目描述
给你一个字符串 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 <= 1000s[i]为'A'、'L'或'P'
分析
转化为容易理解的意思,有一个字符串,当一下两个条件都满足时,返回 true:
A的数量小于 2- 不存在连续超过 3 个(包括3)的
L
代码
直接挨个遍历字符,对 A 和 L 添加状态标记,每次遍历的时候都去检查一下这些状态是否超过界限
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;
};
解法 2
换个思路,只要字符串首和尾找到的 A 下标不相等则表示存在有 2 个及以上的 A
如果字符串中含有3个及以上的 L,那么起码可以说明会有 LLL,代码可以简化为如下,最差情况下完整遍历 2 次字符串
var checkRecord = function(s) {
return !(s.indexOf('LLL') > -1 || s.indexOf('A') != s.lastIndexOf('A'));
};
今天的力扣刷题就分享到这里,感谢大家的阅读~