学生出勤记录 I
难度:
标签:
题目描述
代码结果
运行时间: 18 ms, 内存: 16.0 MB
/*
* 思路:
* 1. 使用流来统计 'A' 的数量并检查是否少于2次。
* 2. 使用流查找是否存在连续3次或以上的 'L'。
* 3. 如果'A'的次数少于2次且不存在连续3次或以上的'L',返回true;否则返回false。
*/
import java.util.stream.IntStream;
public class Solution {
public boolean checkRecord(String s) {
long countA = s.chars().filter(c -> c == 'A').count();
boolean hasThreeConsecutiveL = IntStream.range(0, s.length() - 2)
.anyMatch(i -> s.charAt(i) == 'L' && s.charAt(i + 1) == 'L' && s.charAt(i + 2) == 'L');
return countA < 2 && !hasThreeConsecutiveL;
}
}
解释
方法:
此题解通过单次遍历字符串s来检查出勤记录是否符合奖励条件。它使用两个变量a和l来分别跟踪缺勤和连续迟到的天数。遍历过程中,若遇到'A'字符,则a增加1,如果a超过1,则立即返回False表示不符合条件。对于'L'字符,l增加1,如果l超过2,则也返回False。此外,如果当前字符为'L'但下一个字符不是'L',则将l重置为0。如果整个字符串遍历完毕没有返回False,则表示学生符合获得奖励的条件,返回True。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
在字符串遍历过程中,如果遇到'L'字符,你是如何判断是否重置连续迟到计数器l的?
▷🦆
为什么在缺勤计数器a超过1后,算法立即返回False而不继续检查其他条件?
▷🦆
在处理字符为'L'时,如果当前字符是字符串的最后一个字符,你的算法中是否有考虑到不需要检查下一个字符的情况?
▷🦆
算法中是否考虑了字符串s为空的情况,如果s为空,应该返回什么结果?
▷相关问题
学生出勤记录 II
可以用字符串表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
'A'
:Absent,缺勤'L'
:Late,迟到'P'
:Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
- 按 总出勤 计,学生缺勤(
'A'
)严格 少于两天。 - 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到(
'L'
)记录。
给你一个整数 n
,表示出勤记录的长度(次数)。请你返回记录长度为 n
时,可能获得出勤奖励的记录情况 数量 。答案可能很大,所以返回对 109 + 7
取余 的结果。
示例 1:
输入:n = 2 输出:8 解释: 有 8 种长度为 2 的记录将被视为可奖励: "PP" , "AP", "PA", "LP", "PL", "AL", "LA", "LL" 只有"AA"不会被视为可奖励,因为缺勤次数为 2 次(需要少于 2 次)。
示例 2:
输入:n = 1 输出:3
示例 3:
输入:n = 10101 输出:183236316
提示:
1 <= n <= 105