一、题目
给你一个字符串 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)。仅需要常数空间。