top1编程
← 返回题目
题解

判断字符类别并统计数量

1 条题解

  • 0
    @ 2026-8-5 21:47:33

    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 &lt, 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