题解
判断字符类别并统计数量
1 条题解
-
0
P4610 判断字符类别并统计数量(入门)
解题思路
这道题要求我们把字符串里的字符分成四类:空格、数字、字母、其他,然后分别数出每类的数量。可以这样想象:字符串就是一支长长的队伍,队伍里的每个字符都穿着不同颜色的衣服,我们要让同一种颜色的站到一起,再数一数每种颜色有几个人。
实现时用一个函数
stats()来处理。它拿着整个字符串从头走到尾,每遇到一个字符就判断一次:是空格就把空格计数器加一;是数字('0'到'9')就把数字计数器加一;是字母(大写或小写)就把字母计数器加一;剩下的统统算作"其他字符",把其他计数器加一。有三个容易出错的地方要特别注意。第一,字符串里可能有空格,所以不能用
cin >>直接读入,因为它遇到空格或换行就会停下来,我们要用cin.getline()一次读一整行。第二,判断数字和字母时要用字符比较,比如s[i] >= '0' && s[i] <= '9',这表示这个字符正好落在数字 0 到 9 之间。第三,缓冲区要开得足够大,避免字符串太长被截断,导致统计结果少算;本题实际测试数据里有超过 1000 个字符的情况,所以数组要开大一些。拿题目样例
This is a nice day!来说:里面正好有 4 个空格、0 个数字、14 个字母和 1 个感叹号,所以输出4 0 14 1。计数器都要先清零,边数边加,最后按"空格、数字、字母、其他"的顺序输出,中间用空格隔开。参考代码
// 判断字符类别并统计数量:统计字符串中空格、数字、字母和其他字符的数量 #include <iostream> using namespace std; // 统计函数:遍历字符串s,分别计数空格sp、数字dg、字母lt、其他字符ot void stats(char s[], int &sp, int &dg, int <, int &ot) { for (int i = 0; s[i] != '\0'; i++) { if (s[i] == ' ') sp++; // 空格 else if (s[i] >= '0' && s[i] <= '9') dg++; // 数字 else if ((s[i] >= 'a' && s[i] <= 'z') || (s[i] >= 'A' && s[i] <= 'Z')) lt++; // 字母 else ot++; // 其他字符 } } int main() { char s[10005]; cin.getline(s, 10005); // 读入一整行(可能含空格),缓冲区开大避免截断 int sp = 0, dg = 0, lt = 0, ot = 0; stats(s, sp, dg, lt, ot); cout << sp << " " << dg << " " << lt << " " << ot << endl; return 0; }复杂度分析
程序把字符串的每个字符都检查了一遍,所以时间复杂度是 O(n),这里的 n 是字符串长度(不超过 1000)。程序只用了一个字符数组和四个计数器,额外占用的空间是 O(1)。这个数据规模非常小,程序运行速度极快,可以忽略不计。
- 1