一、题目
给你一个字符串 s ,每两个连续竖线 ‘|’ 为 一对 。换言之,第一个和第二个 ‘|’ 为一对,第三个和第四个 ‘|’ 为一对,以此类推。
请你返回不在 竖线对之间,s 中 ‘*’ 的数目。
注意,每个竖线 ‘|’ 都会 恰好 属于一个对。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/count-asterisks/
二、C解法
我的思路及代码
遍历字符串,遇到第偶数个"|"则进行计数,否则不计数
int countAsterisks(char * s){
int count = 0;
int ans = 0;
while(*s!='\0'){
if(count%2==0){
while(*s!='|'&&*s!='\0'){
if(*s=='*')
ans++;
s++;
}
if(*s!='\0'){
s++;
count++;
}
}
if(count%2==1){
while(*s!='|'&&*s!='\0'){
s++;
}
if(*s!='\0'){
s++;
count++;
}
}
}
return ans;
}
- 时间复杂度:O(n),其中 n是 s 的长度。只需要遍历 s 一遍。
- 空间复杂度:O(1)。仅需要常数空间。
官方参考代码
官方采用了标志位进行奇偶的判断,比我的代码更加简洁和快速
int countAsterisks(char * s) {
bool valid = true;
int res = 0;
for (int i = 0; s[i] != '\0'; i++) {
char c = s[i];
if (c == '|') {
valid = !valid;
} else if (c == '*' && valid) {
res++;
}
}
return res;
}
- 时间复杂度:O(n),其中 n是 s 的长度。只需要遍历 s 一遍。
- 空间复杂度:O(1)。仅需要常数空间。