题目的主要信息:

  • 输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
  • 多行输入,字符串中有空格

方法一:ASCⅡ码比较

具体做法:

因为字符串中有空格,我们不可以用使用cin的流输入,而应该采用getline,直接获取一行。

因为大写字母、小写字母、数字字符在ASCⅡ码中各自内部都是连续的,因此我们可以通过判断字符在ASCⅡ码中的范围判断其属于哪一种字符。

我们遍历字符串,对于每个字符判断是否在大写字母或者小写字母范围之内,如果是就将字母计数加1,如果不是再判断是否在数字范围内,如果是数字就将数字计数加1,如果不是再判断字符是否等于空格,如果是空格计数加1,否则就归纳到其他字符。

alt

#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;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,我们遍历整个字符串
  • 空间复杂度:O(1)O(1),常数个变量,无额外空间

方法二:库函数

具体做法:

除了比较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;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串长度,我们遍历整个字符串,每个判断函数都是O(1)O(1)
  • 空间复杂度:O(1)O(1),常数个变量,无额外空间