题解
判断字符类别并统计数量
1 条题解
-
0
解题思路
题目给出一行字符串,我们要统计里面四类字符各有多少个:
- 空格:就是 ' ';
- 数字:'0' 到 '9';
- 字母:'a' 到 'z' 或者 'A' 到 'Z';
- 其他字符:既不是空格、数字也不是字母的,比如 '!'、'@' 等。
做法就是把字符串从头到尾扫一遍,每看到一个字符就判断它属于哪一类,对应计数器加1。
因为字符串里可能有空格,所以读入的时候不能用普通的
cin >> s(它遇到空格就停了),要改用getline来读一整行。题目要求把统计的过程写成
stats()函数。注意:我们想同时得到4个计数结果,所以函数参数里用了引用(&),这样在函数里修改的计数能传回主程序。打个比方:就像给一盒糖果分类——是糖球就放进"球"盒子,是棒棒糖就放进"棒棒糖"盒子……扫完一整盒,数一数每个盒子各有多少颗就行啦!
参考代码
// P4609 判断字符类别并统计数量:统计空格、数字、字母和其他字符的数量 #include <iostream> using namespace std; // stats函数:统计字符串s中空格、数字、字母、其他字符的数量 void stats(char s[], int &kong, int &shu, int &zimu, int &qita) { kong = shu = zimu = qita = 0; for (int i = 0; s[i] != '\0'; i++) { // 循环到字符串结束 char c = s[i]; if (c == ' ') kong++; // 空格 else if (c >= '0' && c <= '9') shu++; // 数字 else if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) zimu++; // 字母 else qita++; // 其他字符 } } int main() { char s[1005]; cin.getline(s, 1005); // 用getline读入一整行(包含空格) int kong, shu, zimu, qita; stats(s, kong, shu, zimu, qita); cout << kong << " " << shu << " " << zimu << " " << qita << endl; return 0; }复杂度分析
- 字符串长度最多 1000,我们把每个字符都检查一次,所以时间复杂度是 O(len)(len 是字符串长度)。
- 除了存字符串的数组,我们只用了几个计数变量,空间复杂度是 O(1)。
一遍扫描就能数完四类字符,又快又简单!
- 1