前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >leetcode-551-Student Attendance Record I(判断是否出现连续几个相同字符)

leetcode-551-Student Attendance Record I(判断是否出现连续几个相同字符)

作者头像
chenjx85
发布2018-05-22 16:30:11
5850
发布2018-05-22 16:30:11
举报

题目描述:

You are given a string representing an attendance record for a student. The record only contains the following three characters:

  1. 'A' : Absent.
  2. 'L' : Late.
  3. 'P' : Present.

A student could be rewarded if his attendance record doesn't contain more than one 'A' (absent) or more than two continuous 'L' (late).

You need to return whether the student could be rewarded according to his attendance record.

Example 1:

代码语言:javascript
复制
Input: "PPALLP"
Output: True

Example 2:

代码语言:javascript
复制
Input: "PPALLL"
Output: False

要完成的函数:

bool checkRecord(string s)

说明:

1、这道题给定一个字符串,其中只有三种字符P/L/A,分别代表在场/迟到/缺席。如果一个学生出现了一次以上的缺席,或者连续两次以上的迟到,那么他就不能被奖励。要求判断是否某个学生能被奖励。

2、关于A的,很容易,遍历一遍字符串统计A出现次数,当次数大于1时,返回false,结束遍历。

关于L的,也不难,遍历一遍字符串,当碰到L时,判断下一个字符和再下一个字符是否均为L,如果满足,返回false,结束遍历(这里要注意边界条件,即下一个字符是否在字符串以内);如果不满足,那么继续处理下一个字符。

代码如下:

代码语言:javascript
复制
    bool checkRecord(string s) 
    {
        int counta=0,countl=0;
        int s1=s.size();
        for(int i=0;i<s1;i++)
        {
            if(s[i]=='A')
            {
                counta++;
                if(counta>1)
                    return false;
            }
            else if(s[i+2]=='L'&&s[i+1]=='L'&&s[i]=='L')
            {
                if(i+2<s1)
                    return false;
            }
        }
        return true;
    }

上述代码实测6ms,beats 70.11% of cpp submissions。

3、另一种方法

参考了讨论区的代码实现,发现了另一种实际花费时间更少的方法。

代码同样分享给大家,如下:

代码语言:javascript
复制
    bool checkRecord(string s) 
    {
        int counta=0,countl=0;
        for(int i = 0;i < s.size();i++)
        {
            if(s[i]=='A')
            {
                counta++;
                countl=0;//清空countl,重新开始
                if(counta>1)
                    return false;
            }
            else if(s[i]=='L')
            {
                countl++;
                if(countl>2)
                    return false;
            } 
            else 
                countl=0;
        }
        return true;
    }    

上述代码实测4ms,beats 100% of cpp submissions。

这样写代码看起来更加“清爽”,判断是否出现了连续的几个相同字符,采用的是碰到其他字符就“清空”的方法。

而2中的方法,是碰到‘L’时继续判断下一个以及再下一个字符是否仍是'L'的方式,这种方法不需要引进countl的频繁计算。

笔者还是更加喜欢“清爽”的代码,当L出现几百次才要return false的时候,明显清爽代码更省时间。

这道题目给予的启示是:当要判断字符是否连续出现时,可以采用“清空”的方法来做。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述:
  • 要完成的函数:
  • 说明:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档