LeetCode算法题

Stella981
• 阅读 788

这是悦乐书的第258次更新,第271篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第125题(顺位题号是551)。您将获得一个表示学生出勤记录的字符串。 该记录仅包含以下三个字符:

'A':缺席。

'L':迟到。

'P':在场。

如果学生的出勤记录不超过一个“A”(缺席)或超过两个连续的“L”(迟到),则可以奖励学生。您需要返回学生是否可以根据他的出勤记录获得奖励。例如:

输入:“PPALLP” 输出:true

输入:“PPALLL” 输出:false

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

根据题目的意思,出现一次A可以是true,两次及以上是false,连续三次L是false。因此,我们只需要判断该字符串中,A是不是出现了两次及以上;该字符串中是否包含"LLL"子串。对此,我们只需要判断第一次出现A的索引和最后一次出现的A的索引是否相等即可,不相等说明有至少两个A。另外,查找s中是否含有"LLL"子串,都可以直接借助indexOf来完成。

public boolean checkRecord(String s) {
    if (s.indexOf('A') != s.lastIndexOf('A')) {
        return false;
    }
    if (s.indexOf("LLL") != -1) {
        return false;
    }
    return true;
}

03 第二种解法

第一种解法我们再简化下,可以一行代码搞定。也就是s中不包含两个A,并且不包含三个连续的L,才能返回true,否则一律是false。

public boolean checkRecord2(String s) {
    return s.indexOf('A') == s.lastIndexOf('A') && s.indexOf("LLL") == -1;
}

04 第三种解法

我们也可以直接使用记数的方式来判断。使用两个变量,统计A和L出现的次数。for循环内部,如果出现两次A就直接返回false;如果遇上L,记数变量先加1,如果下一个字符不是L就将记数变量重置为0,反之如果连续出现三次,那么就直接返回false。

public boolean checkRecord3(String s) {
    int count_A = 0;
    int count_L = 0;
    for (char ch : s.toCharArray()) {
        if (ch == 'A') {
            count_A++;
            if (count_A >= 2) {
                return false;
            }
        }
        if (ch == 'L') {
            count_L++;
            if (count_L >= 3) {
                return false;
            }
        } else {
            count_L = 0;
        }
    }
    return true;
}

05 第四种解法

我们还可以使用正则表达式来匹配判断。

public boolean checkRecord4(String s) {
    /**
     * 如果含有连续三个L的子串,可以用.*LLL.*表示,.表示匹配除 "\n" 之外的任何单个字符,*匹配前面的子表达式零次或多次。
     * |表示或的关系。.*A.*A.*表示包含两个A。
     */
    return !s.matches(".*LLL.*|.*A.*A.*");
}

06 小结

算法专题目前已日更超过三个月,算法题文章125+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

点赞
收藏
评论区
推荐文章
DaLongggggg DaLongggggg
3年前
python-算法训练 区间k大数查询
问题描述给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。输入格式第一行包含一个数n,表示序列长度。第二行包含n个正整数,表示给定的序列。第三个包含一个正整数m,表示询问个数。接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。输出格式总共输出m行,每行一个数
Stella981 Stella981
3年前
Github最强算法刷题笔记.pdf
资料一昨晚逛GitHub,无意中看到一位大佬(https://github.com/halfrost)的算法刷题笔记,感觉发现了宝藏!有些小伙伴可能已经发现了,但咱这里还是忍不住安利一波,怕有些小伙伴没有看到。关于算法刷题的困惑和疑问也经常听朋友们提及。这份笔记里面共包含作者刷LeetCode算法题后整理的数百道题,每道题均附有详细题
Wesley13 Wesley13
3年前
2020字节高频算法题
字节跳动现在是非常火热的哈,小伙伴们都极为关注。每天都有许多人在面试,有很多童鞋在牛客网写面经,阅读量都非常高。大家都知道字节跳动面试的特色哈,面试必定是要手撕算法的哈~总结了最近两月字节跳动提前批的算法题,大都数都是leetcode上的原题哈,也有一部分是剑指offer上的原题。有需要的小伙伴可以关注下哈。leetcode1
Stella981 Stella981
3年前
Leetcode Index
序:  用于记录刷题过程中难度较大或思路怪异的题目,对于常规难度一般的题就不写入我的博客了,关于效率仅是提交时击败的百分比,可能会随时间波动,仅供参考,算法优劣以时间复杂度和空间复杂度为基准。欢迎留言讨论。题目序号难度效率Leetcode42.TrappingRainWater(https://www.oschina.
Stella981 Stella981
3年前
LeetCode第27题
Givenanarray_nums_andavalue_val_,removeallinstancesofthatvalueinplaceandreturnthenewlength.Donotallocateextraspaceforanotherarray,youmustdothisb
Stella981 Stella981
3年前
LeetCode.1128
这是小川的第394次更新,第428篇原创<br/01看题和准备今天介绍的是LeetCode算法题中Easy级别的第259题(顺位题号是1128)。给定多米诺骨牌列表,当且仅当(ac且bd)或(ad且bc),dominoesia,
Wesley13 Wesley13
3年前
LeetCode刷题实战61:旋转链表
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选!今天和大家聊的问题叫做旋转链表,我们先来看题面:https://leetcodecn.com/problems/rotatelist/Give
Wesley13 Wesley13
3年前
Mysql 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩
 查询所有课程的成绩第2名到第3名的学生信息及该课程成绩1\.查询课程ID为‘01’的课程的成绩第2名到第3名的学生信息及该课程成绩SELECT  d.,c.排名,c.s_score,c.c_idFROM  (SELECTa.s_id,a.s_score,a.c_id,@i:@i1AS排名FROMs
Stella981 Stella981
3年前
LeetCode.1170
这是小川的第412次更新,第444篇原创<br/看题和准备今天介绍的是LeetCode算法题中Easy级别的第263题(顺位题号是1170)。在一个非空字符串s上定义一个函数f(s),该函数计算s中最小字符的出现频率。例如,如果s"dcce",则f(s)2,因为最
Stella981 Stella981
3年前
LeetCode.1029
这是小川的第383次更新,第412篇原创<br/01看题和准备今天介绍的是LeetCode算法题中Easy级别的第245题(顺位题号是1029)。公司计划采访的人数为2N。将第i个人飞往城市A的费用是i0,将第i个人飞到城市B的费用是费用i1。返回将