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

推荐订阅源

MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
雷峰网
雷峰网
V
Visual Studio Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
IT之家
IT之家
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
月光博客
月光博客
A
About on SuperTechFans
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale

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 认证学习微信公众号