题目的主要信息:

  • 统计一行字符中英文字母、空格、数字、其他符号的个数
  • 需要注意的是,可能会有多行输入

方法一:ASCII码统计

根据ASCII码表可知,每一个字符都有编码,并且ASCII码的编号是连续的,同时,c++在比较两个字符的时候是根据ASCII码比较的,因此我们可以根据ASCII码对字符进行判断是数字、英文还是空格,剩下的就是其他字符。由于题目告诉我们会有多个输入,每个输入就是一行字符,因此我们用一个while循环来读取输入,对每一行进行统计的时候需要将统计变量清零。

alt

具体做法:

#include<iostream>
#include<string>

using namespace std;

int main(){
    string str;
    int num_e,num_w,num_n,num_o;//英文字母、空格、数字、其他字符的数量
    num_e=num_w=num_n=num_o=0;
    while(getline(cin,str))//逐行统计
    {
        num_e=num_w=num_n=num_o=0;//每从新的一行开始统计的时候都要清零
        for(int i=0;i<str.size();i++){
            if(str[i]>='0'&&str[i]<='9'){//数字
                num_n++;
            }else if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')){//英文字母
                num_e++;
            }else if(str[i]==' '){//空格
                num_w++;
            }else num_o++;//其他字符
        }
        cout<<num_e<<endl<<num_w<<endl<<num_n<<endl<<num_o<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),需要遍历字符串一遍。
  • 空间复杂度:O(1)O(1),只用了常数空间用来存储统计数量。

方法二:

方法二总体思想和方法一相同,区别在于方法一是通过ASCII码判断字符,比较条件比较繁琐,其实c++有内置的函数可以调用判断字符类型。isalpha()判断当前字符是否为英文字母、isdigit()判断当前字符是否为数字、isspace()判断当前字符是否为空格。

具体做法:

#include<iostream>
#include<string>

using namespace std;

int main(){
    string str;
    int num_e,num_w,num_n,num_o;//英文字母、空格、数字、其他字符的数量
    num_e=num_w=num_n=num_o=0;
    while(getline(cin,str))//逐行统计
    {
        num_e=num_w=num_n=num_o=0;//每从新的一行开始统计的时候都要清零
        for(int i=0;i<str.size();i++){
            if(isdigit(str[i])){//数字
                num_n++;
            }else if(isalpha(str[i])){//英文字母
                num_e++;
            }else if(isspace(str[i])){//空格
                num_w++;
            }else num_o++;//其他字符
        }
        cout<<num_e<<endl<<num_w<<endl<<num_n<<endl<<num_o<<endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),每次统计都需要遍历字符串。
  • 空间复杂度:O(1)O(1),只使用了常数空间记录数量。