惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
爱范儿
爱范儿
J
Java Code Geeks
L
LangChain Blog
V
V2EX
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园 - Franky
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
博客园 - 司徒正美
B
Blog
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
Engineering at Meta
Engineering at Meta
MyScale Blog
MyScale Blog
有赞技术团队
有赞技术团队
Hugging Face - Blog
Hugging Face - Blog

OneCoder

【GESP】C++三级、四级练习 luogu-P2089 烤鸡 【NOIP】1997真题解析 luogu-P2241 统计方形(数据加强版) GESP三、四级以上可练习 【GESP】C++四级练习 luogu-P1296 奶牛的耳语 【CSP】CSP-J 2022 第一轮真题解析(三):完善程序题 【GESP】C++五级练习 luogu-P3743 小鸟的设备 【CSP】CSP-J 2022 第一轮真题解析(二):阅读程序题 【CSP】CSP-J 2022 第一轮真题解析(一):单项选择题 【CSP】CSP-J 2023 第一轮真题解析(三):完善程序题 【CSP】CSP-J 2023 第一轮真题解析(二):阅读程序题 【GESP】C++五级练习 luogu-P1678 烦恼的高考志愿 【CSP】CSP-J 2023 第一轮真题解析(一):单项选择题 【CSP】CSP-J 2024 第一轮真题解析(三):完善程序题 【CSP】CSP-J 2024 第一轮真题解析(二):阅读程序题 【CSP】CSP-J 2024 第一轮真题解析(一):单项选择题 【NOIP】2015真题解析 luogu-P2678 跳石头(适合GESP六级以上练习) 【GESP】C++六级练习 luogu-B2174, 完全背包 【NOIP】2005真题解析 luogu-P1048 采药(适合GESP六级以上练习) 【GESP】C++六级真题 luogu-P17013, [GESP202606 六级] 满二叉树 【GESP】C++六级真题 luogu-P17012, [GESP202606 六级] 条形蛋糕 【GESP】C++五级真题 luogu-P17011 [GESP202606 五级] 晚宴 【GESP】C++五级真题 luogu-P17010 [GESP202606 五级] 排排坐 【GESP】C++四级真题 luogu-B4558 [GESP202606 四级] 身高体重指数 【GESP】C++四级真题 luogu-B4557 [GESP202606 四级] 扫雷 【GESP】C++三级真题 luogu-B4555 [GESP202606 三级] 加密 【GESP】C++二级真题 luogu-B4554 [GESP202606 二级] 菱形 【GESP】C++二级真题 luogu-B4553 [GESP202606 二级] 完全平方数计数 【GESP】C++一级真题 luogu-B4551 [GESP202606 一级] 去旅行 【GESP】C++一级真题 luogu-B4552 [GESP202606 一级] 交税 【NOIP】2000真题解析 luogu-P1023 税收与补贴问题(适合GESP四、五级以上练习) 【NOIP】2000真题解析 luogu-P1022 计算器的改良(适合GESP四、五级以上练习)
【GESP】C++三级真题 luogu-B4556 [GESP202606 三级] 字符转换
OneCoder · 2026-07-04 · via OneCoder

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

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

题目要求

题目描述

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

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

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

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

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

输入格式

输入一共有 $2$ 行。

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

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

输出格式

输出转换后的字符。

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

输入输出样例 #1

输入 #1

输出 #1

说明/提示

原来的字符是 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 认证学习微信公众号