力扣刷题第一天

力扣刷题第一天

给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:

‘A’ : Absent,缺勤
‘L’ : Late,迟到
‘P’ : Present,到场
如果一个学生的出勤记录中不超过一个’A’(缺勤)并且不超过两个连续的’L’(迟到),那么这个学生会被奖赏。

你需要根据这个学生的出勤记录判断他是否会被奖赏。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/student-attendance-record-i
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

为何不直接使用using namespace std,因为使用using会增加名称冲突的可能性。

第一种解法

分别统计A的个数,L连续出现的次数,当L不连续的时候L_num清零

class Solution {
public:
    bool checkRecord(std::string s) {
        int L_num = 0;
        int A_num = 0;
        for(auto c : s) {
            if (c == 'A') {
                ++ A_num;
                L_num = 0;
            } else if (c == 'L') ++L_num;
            else L_num = 0;
            if (A_num > 1 || L_num >2) return false;
        }
        return true;
    }
};

顺便解释一下C++中的auto语法。auto声明该变量自动判断类型。它类型推断发生在编译时期,所以不会造成性能变差。在无法确定返回值时,可以使用auto来做推断。

第二种解法

使用string.find函数来查找字符串。

class Solution2 {
public:
    bool checkRecord(std::string s) {
        return s.find('A', s.find('A') + 1) == -1 && s.find("LLL") == -1;
    }
};

在这里解释一下c++的单引号和双引号的却别:

1、含义不同。

用单引号引起的一个字符实际上代表一个整数,整数值对应于该字符在编译器采用的字符集中的序列值,所以单引号时字符型。而一般我们的编译器采用的都是ASCII字符集。因此’s’的含义其实和十进制数115的含义是一致的。

而用双引号引起的字符串,是字符串型,代表的是一个指向无名数组起始字符的指针。

2、大小不同。

用单引号引起的一个字符大小就是一个字节。

而用双引号引起的字符串大小是字符的总大小+1,因为用双引号引起的字符串会在字符串末尾添加一个二进制为0的字符’\0’。

string.find()函数有两种用法,一个是string.find(‘A’) 查找某个字符或者字符串,查找到第一个字符或者字符串会返回下标,寻找不到则返回-1,在64位操作系统中可能会是18446744073709551615是一个unsinged整数。另外一个用法则是s.find(‘A’,index),从index这个下标开始寻找整数。

golang版本

func checkRecord(s string) bool {
	return strings.Count(s, "A") < 2 && strings.Count(s, "LLL") == 0
}

你可能感兴趣的:(力扣刷题)