题目的主要信息:
- 统计一行字符中英文字母、空格、数字、其他符号的个数
- 需要注意的是,可能会有多行输入
方法一:ASCII码统计
根据ASCII码表可知,每一个字符都有编码,并且ASCII码的编号是连续的,同时,c++在比较两个字符的时候是根据ASCII码比较的,因此我们可以根据ASCII码对字符进行判断是数字、英文还是空格,剩下的就是其他字符。由于题目告诉我们会有多个输入,每个输入就是一行字符,因此我们用一个while循环来读取输入,对每一行进行统计的时候需要将统计变量清零。
具体做法:
#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;
}
复杂度分析:
- 时间复杂度:,需要遍历字符串一遍。
- 空间复杂度:,只用了常数空间用来存储统计数量。
方法二:
方法二总体思想和方法一相同,区别在于方法一是通过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;
}
复杂度分析:
- 时间复杂度:,每次统计都需要遍历字符串。
- 空间复杂度:,只使用了常数空间记录数量。