【Leetcode -551.学生出勤记录Ⅰ -557.反转字符串中的单词Ⅲ】

简介: 【Leetcode -551.学生出勤记录Ⅰ -557.反转字符串中的单词Ⅲ】

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;
    }
目录
相关文章
|
11月前
|
Go 索引
【LeetCode 热题100】394:字符串解码(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 394:字符串解码。题目要求对编码字符串如 `k[encoded_string]` 进行解码,其中 `encoded_string` 需重复 `k` 次。文章提供了两种解法:使用栈模拟和递归 DFS,并附有 Go 语言实现代码。栈解法通过数字栈与字符串栈记录状态,适合迭代;递归解法则利用函数调用处理嵌套结构,代码更简洁。两者时间复杂度均为 O(n),但递归需注意栈深度问题。文章还总结了解题注意事项及适用场景,帮助读者更好地掌握字符串嵌套解析技巧。
326 6
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
406 11
|
C++
Leetcode第43题(字符串相乘)
本篇介绍了一种用C++实现的字符串表示的非负整数相乘的方法,通过逆向编号字符串,将乘法运算转化为二维数组的累加过程,最后处理进位并转换为字符串结果,解决了两个大数相乘的问题。
147 9
|
JavaScript
力扣3333.找到初始输入字符串Ⅱ
【10月更文挑战第9天】力扣3333.找到初始输入字符串Ⅱ
205 1
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
288 0
Leetcode(最后一个单词长度)
这篇文章介绍了两种解决LeetCode第58题的方法,即计算给定字符串中最后一个单词的长度,方法包括翻转字符串和逆向遍历统计。
133 0
【LeetCode 22】459.重复的子字符串
【LeetCode 22】459.重复的子字符串
177 0
【LeetCode 20】151.反转字符串里的单词
【LeetCode 20】151.反转字符串里的单词
142 0
【LeetCode 19】541.反转字符串II
【LeetCode 19】541.反转字符串II
157 0
【LeetCode 18】6.2.反转字符串
【LeetCode 18】6.2.反转字符串
115 0