week4-[字符数组]字符统计
week4-[字符数组]字符统计
题目描述
给定一个仅包含英文字母、数字字符和标点符号(逗号’,‘,句号’.‘,感叹号’!‘,问号’?‘,分号’;')的字符串 SSS。请求出 SSS 中大写字母、小写字母、数字字符和标点符号分别有多少个。
输入格式
输入一行,为一个字符串 SSS。
输出格式
输出一行,包括4个整数,分别表示 SSS 中大写字母、小写字母、数字字符和标点符号分别有多少个
样例 #1
样例输入 #1
HelloWorld.
样例输出 #1
2 8 0 1
样例 #2
样例输入 #2
HappyNewYear2023!
样例输出 #2
3 9 4 1
样例 #3
样例输入 #3
Youcanfoolallpeoplesomeofthetimeorsomepeopleallthetime,youcannotfoolallthepeopleallthetime.
样例输出 #3
1 88 0 2
样例 #4
样例输入 #4
YE5,N0.
样例输出 #4
3 0 2 2
提示
数据范围
对于所有输入数据,SSS 的长度不超过2000。
这题就是一个分类计数问题。字符串里可能有:
- 大写字母
'A' ~ 'Z'
- 小写字母
'a' ~ 'z'
- 数字字符
'0' ~ '9'
- 标点符号 只可能是
, . ! ? ;
解题思路
- 读入一行字符串(可能有字母数字标点混合)。
- 遍历字符串的每一个字符:
- 如果是大写字母 →
cntUpper++
- 如果是小写字母 →
cntLower++
- 如果是数字 →
cntDigit++
- 如果是标点(逗号、句号、感叹号、问号、分号) →
cntPunc++
- 如果是大写字母 →
- 最后输出四个数。
C++参考代码
#include <bits/stdc++.h>
using namespace std;int main() {string S;getline(cin, S); // 读取整行int cntUpper = 0, cntLower = 0, cntDigit = 0, cntPunc = 0;for (char c : S) {if (c >= 'A' && c <= 'Z') cntUpper++;else if (c >= 'a' && c <= 'z') cntLower++;else if (c >= '0' && c <= '9') cntDigit++;else if (c == ',' || c == '.' || c == '!' || c == '?' || c == ';')cntPunc++;}cout << cntUpper << " " << cntLower << " " << cntDigit << " " << cntPunc << "\n";return 0;
}
✅ 时间复杂度:O(n)
(n ≤ 2000,非常小)
✅ 空间复杂度:O(1)