Leetcode -551.学生出勤记录Ⅰ
题目:给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。
记录中只含下面三种字符:
‘A’:Absent,缺勤
‘L’:Late,迟到
‘P’:Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
按 总出勤 计,学生缺勤(‘A’)严格 少于两天。
学生 不会 存在 连续 3 天或 连续 3 天以上的迟到(‘L’)记录。
如果学生可以获得出勤奖励,返回 true ;否则,返回 false 。
示例 1:
输入:s = “PPALLP”
输出:true
解释:学生缺勤次数少于 2 次,且不存在 3 天或以上的连续迟到记录。
示例 2:
输入:s = “PPALLL”
输出:false
解释:学生最后三天连续迟到,所以不满足出勤奖励的条件。
思路是遍历字符串,记录缺勤的次数和是否有三天连续迟到,满足任意一个条件返回false;否则返回true;
bool checkRecord(char* s) { //A记录缺勤次数;L标记是否连续迟到三天 int A = 0, L = 0; if (s[0] == 'A') A++; //遍历字符串,从下标1开始,判断三天是否都迟到,若是,将L记为1 //如果有缺勤,用 A 记录缺勤次数 for (int i = 1; i < strlen(s); i++) { if (s[i - 1] == 'L' && s[i] == 'L' && s[i + 1] == 'L') { L = 1; } else if (s[i] == 'A') { A++; } } //最后判断,缺勤两次及以上,或者连续三天都迟到,返回false if (A >= 2 || L) { return false; } //否则返回true return true; }
Leetcode -557.反转字符串中的单词Ⅲ
题目:给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = “Let’s take LeetCode contest”
输出:“s’teL ekat edoCteeL tsetnoc”
示例 2:
输入: s = “God Ding”
输出:“doG gniD”
思路是使用双指针 i 和 j ,i 为需要反转的第一个字符,j 为需要反转的最后一个,找到每个字符串后的空格,然后反转空格前的字符串,反转完成后将 ++j 赋给 i ,继续迭代;注意最后一个字符串是要找 ’ \0 ',而不是空格;
//反转字符串,注意 right 传进来的时候是空格,交换字符前需要先自减 void reverse(char* left, char* right) { while (left < right) { --right; char tmp = *left; *left++ = *right; *right = tmp; } } char* reverseWords(char* s) { int j = 0, i = 0; //遍历字符串 while (s[j]) { //当s[j]不为空格时,j继续遍历;否则,反转从 i 到 j 的字符串 if (!isspace(s[j])) { j++; } else { reverse(&s[i], &s[j]); i = ++j; } //当到最后一个字符串的时候,字符串的最后不是空格,而是'\0' if (s[j] == '\0') { reverse(&s[i], &s[j]); } } return s; }