携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情
题目链接:2315. 统计星号
题目描述
给你一个字符串 s ,每 两个 连续竖线 '|' 为 一对 。换言之,第一个和第二个 '|' 为一对,第三个和第四个 '|' 为一对,以此类推。
请你返回 不在 竖线对之间,s 中 '*' 的数目。
注意,每个竖线 '|' 都会 恰好 属于一个对。
提示:
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 。
整理题意
题目要求统计不在一对 '|' 之内的 '*' 个数。所谓的一对 '|' 表示的是第奇数个和第偶数个出现的两两成为一对。统计第偶数个和第奇数个出现的 '|' 之间的 '*' 个数。
解题思路分析
用一个变量记录当前出现的 '|' 是第奇数个还是第偶数个。当 '|' 是偶数个时,且遇到 '*' 就记录个数,否则不记录。
具体实现
- 按顺序遍历字符串,记录
'|'出现的次数。 - 遇见
'*'的时候判断'|'出现的次数,如果出现次数为奇数,那么不统计'*'个数,否则统计。 - 最后返回统计的
'*'个数即可。
复杂度分析
- 时间复杂度:,仅需遍历一遍字符串数组。
- 空间复杂度:,仅需常数存储空间。
代码实现
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;
}
};
总结
- 该题核心为区分题目规定的一对
'|'之内和之外,这里可以直接使用一个变量来进行标记处理。 - 该题还可以利用双指针的思想进行解题,利用左指针找到第一个
'|',再用右指针找到第二个'|',在利用左指针找第一个'|'的时候统计'*'个数即可。 - 测试结果:
结束语
人生有所舍,才能有所得;有所放下,才能有所收获。与其对许多小事都耿耿于怀,不如抬起头、迈开脚,放下负累,让自己坦然自在。愿我们都能在今后的人生中学会适时地放下,收获更多的幸福。新的一天,加油!