LeetCode基础算法题第133篇:学生考勤记录 I

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后> 到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和> 精力有限,其他语言的实现有兴趣的朋友请自己尝试。初级难度说的差不多的时候,我打算再加点其他内容,我可能会从操作系统到协议栈,从分布式> 聊到大数据框架,从大数据聊到人工智能,... ...。

如果有任何问题可以在文章后评论或者私信给我。

我会持续分享下去,敬请您的关注。

LeetCode 551. 学生考勤记录 I(Student Attendance Record I)

问题描述:

用一个字符串来表示一个学生的考勤记录,这个记录仅包含以下三种字符:

  1. 'A' : Absent(缺席)
  2. 'L' : Late(迟到)
  3. 'P' : Present(出席)

如果一个学生的考勤记录中不超过一个'A',并且不超过两个连续的'L',则这个学生会得到奖赏。请你根据这个学生的考勤记录判断他是否会得到奖赏。

示例:

C语言实现:

这个题目很简单了,我们仅仅需要做两件事情:

  1. 查找s是否存在两个A字符;
  2. 查找s是否存在子串"LLL";

我们有两种实现方法:

第一种. 直接返回:

return !strstr(s, "LLL") && strchr(s, 'A') == strrchr(s, 'A');

用strstr函数来查找"LLL"是否在s中存在;

用strchr和strrchr分别从s的首尾查找‘A’。如果存在多个‘A’的话这两个函数一定返回不同的指针地址;相反如果他们返回的结果相同,则说明不存在‘A’或仅存在一个‘A’。

第二种. 上面的方法简单,但是在某些情况下,逻辑上等同于对s遍历两次,我们可以用常规的对字符串遍历的方法来做:

声明3个变量Acount, Lstat, Lcount,分别记录‘A’出现的次数,‘L’是否连续,‘L’连续出现的次数。

遍历的时候,分别赋值并检查Acount和Lcount的值,如果Acount > 1 或者 Lcount > 2 就停止遍历,直接返回false。这样最多只需要对s遍历一次。

代码如下:

Java语言实现:

Java 的实现是通过indexOf方法来查找“A”和“LLL”,类似C实现的第一种方法,不再撰述。

代码如下:

Python语言实现:

Python 的实现类似C实现的第一种方法,不再撰述。

代码如下:


谢谢大家一直以来的关注和支持!

我一直在努力的写好每一篇文章,画好每一份插图。但是作为一个996从业人员,时间精力十分有限。所以针对评论部分,以后只回答粉丝的问题和私信。希望仅仅是路过的朋友能够体谅,希望更多人关注《吾是我师》,谢谢!


发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();