文章

【GESP】C++三级真题 luogu-B4556 [GESP202606 三级] 字符转换

GESP C++三级,2026年6月真题,字符大小写转换与数字替换,难度⭐,洛谷难度入门

luogu-B4556 [GESP202606 三级] 字符转换

题目要求

题目描述

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

  • 大写字母,比如 $A$、$B$、$C$
  • 小写字母,比如 $a$、$b$、$c$
  • 数字,比如 $0$、$1$、$2$

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

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

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

输入格式

输入一共有 $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$ 个。每个字符只会是大写字母、小写字母或数字。


题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:
    • 逐个字符判断类型(大写、小写、数字),按规则进行转换输出
    • 大小写互换,数字统一替换为 *
  2. 解题关键 — 字符类型判断与转换:
    • 大写字母:ASCII 码范围 $[65, 90]$(即 'A''Z'),转小写可加 $32$,或使用 tolower() 函数
    • 小写字母:ASCII 码范围 $[97, 122]$(即 'a''z'),转大写可减 $32$,或使用 toupper() 函数
    • 数字字符:ASCII 码范围 $[48, 57]$(即 '0''9'),直接替换为 '*'
    • 也可以使用 isupper()islower()isdigit() 等标准库函数进行判断
  3. 复杂度分析:
    • 时间复杂度:$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),考试认证学员交流,互帮互助

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
本文由作者按照 CC BY-NC-SA 4.0 进行授权