目录
题目要求
给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
'A':Absent,缺勤
'L':Late,迟到
'P':Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:按 总出勤 计,学生缺勤('A')严格 少于两天。
学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。
如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。示例 1:
输入:s = "PPALLP"
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。
示例 2:输入:s = "PPALLL"
输出:false
解释:学生最后三天连续迟到,所以不满足出勤奖励的条件。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/student-attendance-record-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
没思路,学习了评论区里的大佬的实现方法,在这里记录一下。
代码实现1
/**
* 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
*
* 'A':Absent,缺勤
* 'L':Late,迟到
* 'P':Present,到场
* 如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
*
* 按 总出勤 计,学生缺勤('A')严格 少于两天。
* 学生 不会 存在 连续 3 天或 连续 3 天以上的迟到('L')记录。
* 如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/student-attendance-record-i
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
*/
public class StudentRecord {
public static void main(String[] args) {
String s = "PPALLL";
boolean b = checkRecord(s);
System.out.println(b);
}
public static boolean checkRecord(String s) {
return s.indexOf("A") == s.lastIndexOf("A") && !s.contains("LLL");
}
}
代码分析1
代码主要就一句话,但我不会写,想不到。
来学学这句话:
return s.indexOf("A") == s.lastIndexOf("A") && !s.contains("LLL");
题目要求返回true或者false。在方法中就这一句话。
题目的关键在于:返回true的前提是:字符串中不能出现两次A 并且 不能连续出现三个L。
这里调用了3个方法,所以
1、indexOf(String str)
返回字符串中的str字符(或者字符串)第一次出现的位置,没有就返回-1。
2、lastIndexOf(String str)
返回字符串中str字符串出现的最后一次出现的位置,没有出现就返回-1。
有以下几种形式:
-
public int lastIndexOf(int ch): 返回指定字符在此字符串中最后一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
-
public int lastIndexOf(int ch, int fromIndex): 返回指定字符str在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索,如果此字符串中没有这样的字符,则返回 -1。
-
public int lastIndexOf(String str): 返回指定子字符串在此字符串中最右边出现处的索引,如果此字符串中没有这样的字符,则返回 -1。
-
public int lastIndexOf(String str, int fromIndex): 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索,如果此字符串中没有这样的字符,则返回 -1。
3、contains(CharSequence s)
返回类型为布尔类型,若包含指定序列,返回true,否则返回false。
代码实现2
class Solution {
public boolean checkRecord(String s) {
int absent=0;
int late=0;
for (int i=0;i<s.length();i++){
if (s.charAt(i)=='A'){
late=0;
absent++;
if (absent>1)
return false;
}
else if (s.charAt(i)=='L'){
late++;
if (late>2)
return false;
}
else
late=0;
}
return true;
}
}
代码解释2
定义两个变量absent(记录A的次数) 和late (迟到L的次数)
利用for循环遍历字符串,字符串里面字符只能是A,P,L,如果是A或者P,说明不是L,,把late顺便置为0,如果A的次数absent超过2次,就返回false;如果late的值累计到达3也返回false。