CCF-GESP计算机学会等级考试2026年6月三级C++T2 字符转换

B4556 [GESP202606 三级] 字符转换

题目描述

小杨同学有一串字符,里面可能有:

  • 大写字母,比如AAABBBCCC
  • 小写字母,比如aaabbbccc
  • 数字,比如000111222

现在小杨同学想把这串字符变一变,规则如下:

  1. 如果是大写字母,就变成对应的小写字母;
  2. 如果是小写字母,就变成对应的大写字母;
  3. 如果是数字,就变成*

请你按照这个规则,帮小杨把整串字符转换好。

输入格式

输入一共有222行。

第一行:一个整数,表示这串字符一共有多少个字符。

第二行:一串连续的字符,中间没有空格。

输出格式

输出转换后的字符。

注意:输出时字符之间不要加空格。

输入输出样例 #1

输入 #1

5 aBc98

输出 #1

AbC**

说明/提示

原来的字符是:

aBc98

从左到右一个一个看:

  1. aaa是小写字母,所以变成AAA
  2. BBB是大写字母,所以变成bbb
  3. ccc是小写字母,所以变成CCC
  4. 999是数字,所以变成*
  5. 888是数字,所以变成*

所以最后输出:

AbC**

数据范围

字符个数不会超过100010001000个。

每个字符只会是大写字母、小写字母或数字。

题解

这道题要求对给定的字符序列进行三种规则转换:

  • 大写字母 → 小写字母
  • 小写字母 → 大写字母
  • 数字 →*

我直接遍历字符串中的每个字符,利用 C++ 标准库提供的字符判断和转换函数(isupperislowerisdigittolowertoupper)来依次判断并修改。由于字符串可以原地修改,我直接修改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;}