题目的主要信息:
- 输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- 多行输入,字符串中有空格
方法一:ASCⅡ码比较
具体做法:
因为字符串中有空格,我们不可以用使用cin的流输入,而应该采用getline,直接获取一行。
因为大写字母、小写字母、数字字符在ASCⅡ码中各自内部都是连续的,因此我们可以通过判断字符在ASCⅡ码中的范围判断其属于哪一种字符。
我们遍历字符串,对于每个字符判断是否在大写字母或者小写字母范围之内,如果是就将字母计数加1,如果不是再判断是否在数字范围内,如果是数字就将数字计数加1,如果不是再判断字符是否等于空格,如果是空格计数加1,否则就归纳到其他字符。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
while(getline(cin, str)){
int whitespace = 0;
int digits = 0;
int letters = 0;
int others = 0;
for(int i = 0; i < str.length(); i++){ //遍历字符串
char c = str[i];
if((c >= 'A' && c <= 'Z') || (c >= 'a' && c <='z')) //判断是否是字母
letters++;
else if(c >= '0' && c <= '9') //判断是否是数字
digits++;
else if(c == ' ') //判断是否是空格
whitespace++;
else //剩下的就是其他字符
others++;
}
cout << letters << endl << whitespace << endl << digits << endl << others << endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,我们遍历整个字符串
- 空间复杂度:,常数个变量,无额外空间
方法二:库函数
具体做法:
除了比较ASCⅡ码,我们还可以调用字符串string类中的内置函数,一些内置函数如下:
字符判断函数 | 作用 |
---|---|
isalpha() | 判断字符是否是字母('a'-'z' 'A'-'Z') |
isdigit() | 判断字符是否是数字 |
isspace() | 判断字符是否是空格、制表符、换行等标准空白 |
isalnum() | 判断字符是否是字母或者数字 |
ispunct() | 判断字符是标点符号 |
islower() | 判断字符是否是小写字母('a'-'z') |
isupper() | 判断字符是否是大写字母('A'-'Z') |
我们还是遍历字符串,对于每个字符依次使用前三个函数检查字符即可,最后剩下的就是其他字符。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
while(getline(cin, str)){
int whitespace = 0;
int digits = 0;
int letters = 0;
int others = 0;
for(int i = 0; i < str.length(); i++){ //遍历字符串
if(isalpha(str[i])) //判断是否是字母
letters++;
else if(isdigit(str[i])) //判断是否是数字
digits++;
else if(isspace(str[i])) //判断是否是空格
whitespace++;
else //剩下的就是其他字符
others++;
}
cout << letters << endl << whitespace << endl << digits << endl << others << endl;
}
return 0;
}
复杂度分析:
- 时间复杂度:,其中为字符串长度,我们遍历整个字符串,每个判断函数都是
- 空间复杂度:,常数个变量,无额外空间