力扣刷题第一天
给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符:
‘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
}