【GESP】C++三级真题 luogu-B4556 [GESP202606 三级] 字符转换
GESP C++三级,2026年6月真题,字符大小写转换与数字替换,难度⭐,洛谷难度入门。
luogu-B4556 [GESP202606 三级] 字符转换
题目要求
题目描述
小杨同学有一串字符,里面可能有:
- 大写字母,比如 $A$、$B$、$C$
- 小写字母,比如 $a$、$b$、$c$
- 数字,比如 $0$、$1$、$2$
现在小杨同学想把这串字符变一变,规则如下:
- 如果是大写字母,就变成对应的小写字母;
- 如果是小写字母,就变成对应的大写字母;
- 如果是数字,就变成
*。请你按照这个规则,帮小杨把整串字符转换好。
输入格式
输入一共有 $2$ 行。
第一行:一个整数,表示这串字符一共有多少个字符。
第二行:一串连续的字符,中间没有空格。
输出格式
输出转换后的字符。
注意:输出时字符之间不要加空格。
输入输出样例 #1
输入 #1
1
2
5
aBc98
输出 #1
1
AbC**
说明/提示
原来的字符是 aBc98,从左到右依次转换:$a \to A$,$B \to b$,$c \to C$,$9 \to *$,$8 \to *$。最终输出 AbC**。
数据范围
字符个数不超过 $1000$ 个。每个字符只会是大写字母、小写字母或数字。
题目分析
解题思路
本题的解题思路如下:
- 问题本质:
- 逐个字符判断类型(大写、小写、数字),按规则进行转换输出
- 大小写互换,数字统一替换为
*
- 解题关键 — 字符类型判断与转换:
- 大写字母:ASCII 码范围 $[65, 90]$(即
'A'到'Z'),转小写可加 $32$,或使用tolower()函数 - 小写字母:ASCII 码范围 $[97, 122]$(即
'a'到'z'),转大写可减 $32$,或使用toupper()函数 - 数字字符:ASCII 码范围 $[48, 57]$(即
'0'到'9'),直接替换为'*' - 也可以使用
isupper()、islower()、isdigit()等标准库函数进行判断
- 大写字母:ASCII 码范围 $[65, 90]$(即
- 复杂度分析:
- 时间复杂度:$O(n)$,其中 $n$ 为字符个数,每个字符只需常数时间判断和转换
- 空间复杂度:$O(n)$,用于存储输入的字符串(也可以边读边处理,降至 $O(1)$)
示例代码
方法一、逐字符判断并利用 ASCII 码转换
利用大写字母与小写字母的 ASCII 码相差 $32$ 的特性,通过加减 $32$ 完成大小写互换。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <string>
int main() {
// 读入字符个数
int n;
std::cin >> n;
// 读入字符串
std::string s;
std::cin >> s;
// 逐字符判断并转换
for (int i = 0; i < n; i++) {
char c = s[i];
if (c >= 'A' && c <= 'Z') {
// 大写字母转小写:ASCII 码加 32
std::cout << (char)(c + 32);
} else if (c >= 'a' && c <= 'z') {
// 小写字母转大写:ASCII 码减 32
std::cout << (char)(c - 32);
} else {
// 数字字符替换为 '*'
std::cout << '*';
}
}
std::cout << std::endl;
return 0;
}
方法二、使用标准库函数
利用 isupper()、islower() 判断字符类型,toupper()、tolower() 完成大小写转换,代码更简洁易读。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <string>
#include <cctype>
int main() {
// 读入字符个数
int n;
std::cin >> n;
// 读入字符串
std::string s;
std::cin >> s;
// 逐字符判断并转换
for (int i = 0; i < n; i++) {
char c = s[i];
if (isupper(c)) {
// 大写字母转小写
std::cout << (char)tolower(c);
} else if (islower(c)) {
// 小写字母转大写
std::cout << (char)toupper(c);
} else {
// 数字字符替换为 '*'
std::cout << '*';
}
}
std::cout << std::endl;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
"luogu-"系列题目可在洛谷题库进行在线评测。
"bcqm-"系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
本文由作者按照 CC BY-NC-SA 4.0 进行授权
