【C/C++】2315. 统计星号

127 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情


题目链接:2315. 统计星号

题目描述

给你一个字符串 s ,每 两个 连续竖线 '|' 为 一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个 '|' 为一对,以此类推。

请你返回 不在 竖线对之间,s 中 '*' 的数目。

注意,每个竖线 '|' 都会 恰好 属于一个对。

提示:

  • 1s.length10001 \leqslant s.length \leqslant 1000
  • s 只包含小写英文字母,竖线 '|' 和星号 '*' 。
  • s 包含 偶数 个竖线 '|' 。

示例 1:

输入:s = "l|*e*et|c**o|*de|"
输出:2
解释:不在竖线对之间的字符加粗加斜体后,得到字符串:"l|*e*et|c**o|*de|" 。
第一和第二条竖线 '|' 之间的字符不计入答案。
同时,第三条和第四条竖线 '|' 之间的字符也不计入答案。
不在竖线对之间总共有 2 个星号,所以我们返回 2

示例 2:

输入: s = "iamprogrammer"
输出: 0
解释: 在这个例子中,s 中没有星号。所以返回 0 。

示例 3:

输入:s = "yo|uar|e**|b|e***au|tifu|l"
输出:5
解释:需要考虑的字符加粗加斜体后:"yo|uar|e**|b|e***au|tifu|l" 。不在竖线对之间总共有 5 个星号。所以我们返回 5 。

整理题意

题目要求统计不在一对 '|' 之内的 '*' 个数。所谓的一对 '|' 表示的是第奇数个和第偶数个出现的两两成为一对。统计第偶数个和第奇数个出现的 '|' 之间的 '*' 个数。

解题思路分析

用一个变量记录当前出现的 '|' 是第奇数个还是第偶数个。当 '|' 是偶数个时,且遇到 '*' 就记录个数,否则不记录。

具体实现

  1. 按顺序遍历字符串,记录 '|' 出现的次数。
  2. 遇见 '*' 的时候判断 '|' 出现的次数,如果出现次数为奇数,那么不统计 '*' 个数,否则统计。
  3. 最后返回统计的 '*' 个数即可。

复杂度分析

  • 时间复杂度:O(n)O(n),仅需遍历一遍字符串数组。
  • 空间复杂度:O(1)O(1),仅需常数存储空间。

代码实现

class Solution {
public:
    int countAsterisks(string s) {
        int len = s.length();
        //f记录是否可以记录*的个数
        bool f = true;
        //ans记录不在条件内的*
        int ans = 0;
        //遍历
        for(int i = 0; i < len; i++){
            if(s[i] == '|'){
                if(f) f = false;
                else f = true;
            }
            if(s[i] == '*' && f) ans++;
        }
        return ans;
    }
};

总结

  • 该题核心为区分题目规定的一对 '|' 之内和之外,这里可以直接使用一个变量来进行标记处理。
  • 该题还可以利用双指针的思想进行解题,利用左指针找到第一个 '|',再用右指针找到第二个 '|',在利用左指针找第一个 '|' 的时候统计 '*' 个数即可。
  • 测试结果:

2315.png

结束语

人生有所舍,才能有所得;有所放下,才能有所收获。与其对许多小事都耿耿于怀,不如抬起头、迈开脚,放下负累,让自己坦然自在。愿我们都能在今后的人生中学会适时地放下,收获更多的幸福。新的一天,加油!