CCF-GESP计算机学会等级考试2026年6月三级C++T2 字符转换
B4556 [GESP202606 三级] 字符转换
题目描述
小杨同学有一串字符,里面可能有:
- 大写字母,比如AAA、BBB、CCC
- 小写字母,比如aaa、bbb、ccc
- 数字,比如000、111、222
现在小杨同学想把这串字符变一变,规则如下:
- 如果是大写字母,就变成对应的小写字母;
- 如果是小写字母,就变成对应的大写字母;
- 如果是数字,就变成
*。
请你按照这个规则,帮小杨把整串字符转换好。
输入格式
输入一共有222行。
第一行:一个整数,表示这串字符一共有多少个字符。
第二行:一串连续的字符,中间没有空格。
输出格式
输出转换后的字符。
注意:输出时字符之间不要加空格。
输入输出样例 #1
输入 #1
5 aBc98输出 #1
AbC**说明/提示
原来的字符是:
aBc98从左到右一个一个看:
- aaa是小写字母,所以变成AAA;
- BBB是大写字母,所以变成bbb;
- ccc是小写字母,所以变成CCC;
- 999是数字,所以变成
*; - 888是数字,所以变成
*。
所以最后输出:
AbC**数据范围
字符个数不会超过100010001000个。
每个字符只会是大写字母、小写字母或数字。
题解
这道题要求对给定的字符序列进行三种规则转换:
- 大写字母 → 小写字母
- 小写字母 → 大写字母
- 数字 →
*
我直接遍历字符串中的每个字符,利用 C++ 标准库提供的字符判断和转换函数(isupper、islower、isdigit、tolower、toupper)来依次判断并修改。由于字符串可以原地修改,我直接修改s[i]的值,最后输出整个字符串即可。
时间复杂度O(n),n 为字符个数(≤1000),非常高效。
空间复杂度O(1)(除输入字符串外,只用了几个变量)。
注意:输入第二行是连续字符串,中间没有空格,直接用cin >> s读取即可。输出时不要加空格,直接输出转换后的字符串。
带注释的源代码
#include<bits/stdc++.h>usingnamespacestd;intn;// 字符个数string s;// 存储输入的字符串intmain(){cin>>n;// 读入字符个数(实际上可以不用,因为字符串长度已知,但按照题目输入格式需要读)cin>>s;// 读入待转换的字符串// 遍历字符串的每一个字符for(inti=0;i<n;i++){// 如果是大写字母,转为对应的小写字母if(isupper(s[i])){s[i]=tolower(s[i]);}// 如果是小写字母,转为对应的大写字母elseif(islower(s[i])){s[i]=toupper(s[i]);}// 如果是数字,转为 '*'elseif(isdigit(s[i])){s[i]='*';}// 根据题目保证,字符只会是大写字母、小写字母或数字,所以无需处理其他情况}// 输出转换后的字符串(中间无空格)cout<<s;return0;}