【题目来源】洛谷B4556 [GESP202606 三级] 字符转换 - 洛谷【题目描述】小杨同学有一串字符里面可能有大写字母比如A AA、B BB、C CC小写字母比如a aa、b bb、c cc数字比如0 00、1 11、2 22现在小杨同学想把这串字符变一变规则如下如果是大写字母就变成对应的小写字母如果是小写字母就变成对应的大写字母如果是数字就变成*。请你按照这个规则帮小杨把整串字符转换好。【输入】输入一共有2 22行。第一行一个整数表示这串字符一共有多少个字符。第二行一串连续的字符中间没有空格。【输出】输出转换后的字符。注意输出时字符之间不要加空格。【输入样例】5 aBc98【输出样例】AbC**【核心思想】问题分析给定长度为n nn的字符串S SS需要对每个字符进行分类转换大写字母→ \to→小写字母、小写字母→ \to→大写字母、数字→ \to→*。本质是字符级别的条件映射问题根据字符的 ASCII 属性执行不同的转换规则。算法选择逐字符分类转换遍历字符串利用字符分类函数islower()、isupper()、isdigit()判断类型调用对应的大小写转换函数或替换为*原地修改直接在原字符串上修改无需额外空间关键步骤读取输入n nn字符串长度和S SS遍历转换对S SS的每个字符S i S_iSi若islower(S_i)为真S i ← S_i \leftarrowSi←toupper(S_i)小写转大写否则若isupper(S_i)为真S i ← S_i \leftarrowSi←tolower(S_i)大写转小写否则S i ← S_i \leftarrowSi←*数字等字符替换输出结果输出转换后的字符串S SS时间/空间复杂度时间复杂度O ( n ) O(n)O(n)遍历字符串一次每个字符的分类和转换均为O ( 1 ) O(1)O(1)空间复杂度O ( 1 ) O(1)O(1)除输入字符串外原地修改无需额外辅助空间字符分类转换的核心思想类型三分支将字符集划分为互斥的三个子集小写字母、大写字母、其他每个子集对应唯一的转换规则通过if-else if-else链实现清晰的分支逻辑ASCII 码运算toupper和tolower内部基于 ASCII 码的固定偏移小写与大写相差32 3232实现O ( 1 ) O(1)O(1)转换也可手动通过S[i] ^ 32仅对字母实现原地覆盖策略直接在原字符串上修改避免创建新字符串带来的额外空间开销符合转换而非生成的语义防御性编程使用islower/isupper而非直接比较 ASCII 范围代码可读性更强且能正确处理扩展字符集尽管本题限定为字母和数字适用于字符级别的条件替换、大小写互换、符号过滤等基础字符串处理问题【算法标签】#入门 #字符串入门【代码详解】#includebits/stdc.husingnamespacestd;intn;// n: 字符串长度string s;// s: 需要转换的字符串intmain(){cinns;// 读入字符串长度和字符串本身for(inti0;is.size();i)// 遍历字符串中的每个字符{if(islower(s[i]))// 如果是小写字母s[i]toupper(s[i]);// 转换为对应的大写字母elseif(isupper(s[i]))// 如果是大写字母s[i]tolower(s[i]);// 转换为对应的小写字母else// 如果是数字等其他字符s[i]*;// 替换为 *}coutsendl;// 输出转换后的字符串return0;}【运行结果】5 aBc98 AbC**
题解:洛谷 B4556 [GESP202606 三级] 字符转换
【题目来源】洛谷B4556 [GESP202606 三级] 字符转换 - 洛谷【题目描述】小杨同学有一串字符里面可能有大写字母比如A AA、B BB、C CC小写字母比如a aa、b bb、c cc数字比如0 00、1 11、2 22现在小杨同学想把这串字符变一变规则如下如果是大写字母就变成对应的小写字母如果是小写字母就变成对应的大写字母如果是数字就变成*。请你按照这个规则帮小杨把整串字符转换好。【输入】输入一共有2 22行。第一行一个整数表示这串字符一共有多少个字符。第二行一串连续的字符中间没有空格。【输出】输出转换后的字符。注意输出时字符之间不要加空格。【输入样例】5 aBc98【输出样例】AbC**【核心思想】问题分析给定长度为n nn的字符串S SS需要对每个字符进行分类转换大写字母→ \to→小写字母、小写字母→ \to→大写字母、数字→ \to→*。本质是字符级别的条件映射问题根据字符的 ASCII 属性执行不同的转换规则。算法选择逐字符分类转换遍历字符串利用字符分类函数islower()、isupper()、isdigit()判断类型调用对应的大小写转换函数或替换为*原地修改直接在原字符串上修改无需额外空间关键步骤读取输入n nn字符串长度和S SS遍历转换对S SS的每个字符S i S_iSi若islower(S_i)为真S i ← S_i \leftarrowSi←toupper(S_i)小写转大写否则若isupper(S_i)为真S i ← S_i \leftarrowSi←tolower(S_i)大写转小写否则S i ← S_i \leftarrowSi←*数字等字符替换输出结果输出转换后的字符串S SS时间/空间复杂度时间复杂度O ( n ) O(n)O(n)遍历字符串一次每个字符的分类和转换均为O ( 1 ) O(1)O(1)空间复杂度O ( 1 ) O(1)O(1)除输入字符串外原地修改无需额外辅助空间字符分类转换的核心思想类型三分支将字符集划分为互斥的三个子集小写字母、大写字母、其他每个子集对应唯一的转换规则通过if-else if-else链实现清晰的分支逻辑ASCII 码运算toupper和tolower内部基于 ASCII 码的固定偏移小写与大写相差32 3232实现O ( 1 ) O(1)O(1)转换也可手动通过S[i] ^ 32仅对字母实现原地覆盖策略直接在原字符串上修改避免创建新字符串带来的额外空间开销符合转换而非生成的语义防御性编程使用islower/isupper而非直接比较 ASCII 范围代码可读性更强且能正确处理扩展字符集尽管本题限定为字母和数字适用于字符级别的条件替换、大小写互换、符号过滤等基础字符串处理问题【算法标签】#入门 #字符串入门【代码详解】#includebits/stdc.husingnamespacestd;intn;// n: 字符串长度string s;// s: 需要转换的字符串intmain(){cinns;// 读入字符串长度和字符串本身for(inti0;is.size();i)// 遍历字符串中的每个字符{if(islower(s[i]))// 如果是小写字母s[i]toupper(s[i]);// 转换为对应的大写字母elseif(isupper(s[i]))// 如果是大写字母s[i]tolower(s[i]);// 转换为对应的小写字母else// 如果是数字等其他字符s[i]*;// 替换为 *}coutsendl;// 输出转换后的字符串return0;}【运行结果】5 aBc98 AbC**