top1编程
← 返回题目
题解

判断字符类别并统计数量

1 条题解

  • 0
    @ 2026-8-5 12:14:09

    解题思路

    题目给出一行字符串,我们要统计里面四类字符各有多少个:

    1. 空格:就是 ' ';
    2. 数字:'0' 到 '9';
    3. 字母:'a' 到 'z' 或者 'A' 到 'Z';
    4. 其他字符:既不是空格、数字也不是字母的,比如 '!'、'@' 等。

    做法就是把字符串从头到尾扫一遍,每看到一个字符就判断它属于哪一类,对应计数器加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