leetcode
leetcode 501 ~ 550
学生出勤记录 I

学生出勤记录 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的?
在遍历字符串时,每次遇到'L'字符,会先增加连续迟到计数器l的值。然后,我会检查当前位置是否小于字符串长度减1(即不是最后一个字符),如果是这种情况,我接着查看下一个字符是否也是'L'。如果下一个字符不是'L',说明连续迟到的情况已经结束,因此需要重置l为0。这样可以确保l只计数连续的'L'字符序列。
🦆
为什么在缺勤计数器a超过1后,算法立即返回False而不继续检查其他条件?
根据题目的规则,如果学生的缺勤次数超过1次,则不符合获得奖励的条件。因此,一旦缺勤计数器a的值超过1,无论字符串中后面的字符如何,学生已经不符合条件了。为了提高算法效率,一旦确定无法满足条件,立即返回False,避免不必要的进一步检查。
🦆
在处理字符为'L'时,如果当前字符是字符串的最后一个字符,你的算法中是否有考虑到不需要检查下一个字符的情况?
是的,我的算法中考虑到了这一点。在代码中,每次增加连续迟到计数器l之前,都会检查当前字符是否是字符串的最后一个字符。这是通过判断当前索引i是否小于字符串长度减1来实现的。如果i等于字符串长度减1(即当前字符是最后一个字符),则不会进行下一个字符的检查,也不会错误地访问超出字符串长度的索引。
🦆
算法中是否考虑了字符串s为空的情况,如果s为空,应该返回什么结果?
算法确实考虑了字符串s为空的情况。如果字符串为空,说明没有任何出勤记录,因此没有缺勤或连续迟到的情况发生。根据题目的定义,学生在没有任何违规记录的情况下默认符合获得奖励的条件。因此,如果输入字符串s为空,算法应该返回True。

相关问题

学生出勤记录 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