[字符串题-java实现]LeetCode551. 学生出勤记录 I

目录

题目要求

 代码实现1

代码分析1

1、indexOf(String str)

2、lastIndexOf(String str)

3、contains(CharSequence s)

代码实现2

代码解释2


 

题目要求

给你一个字符串 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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值