题目的主要信息:

  • 找出给定字符串中大写字符(即'A'-'Z')的个数
  • 进阶要求:时间复杂度O(n)O(n),空间复杂度O(n)O(n)

方法一:ASCⅡ码比较

具体做法:

大写字母A的ASCⅡ码为65,大写字母Z的ASCⅡ码为90,我们只要遍历字符串,比较每个字符的ASCⅡ码在这之间就可以统计大写字母的个数。

alt

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s;
    while(getline(cin, s)){
        int count = 0;
        for(int i = 0; i < s.length(); i++) //遍历字符串每个字符
            if(s[i] >= 65 && s[i] <= 90)  //用ASCⅡ码比较
                count++;
        cout << count << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串的长度,遍历比较
  • 空间复杂度:O(1)O(1),无额外空间

方法二:库函数

具体做法:

直接使用库函数isupper判断字符是否是大写字母,遍历字符串,每个字符依次调用函数判断,然后统计计数。

#include<iostream>
#include<string>
using namespace std;

int main(){
    string s;
    while(getline(cin, s)){
        int count = 0;
        for(int i = 0; i < s.length(); i++) //遍历字符串每个字符
            if(isupper(s[i]))  //用函数检查是否是大写字母
                count++;
        cout << count << endl;
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn为字符串的长度,遍历判断,其中isupper函数复杂度为O(1)O(1)
  • 空间复杂度:O(1)O(1),无额外空间