226小T的密码变换规则——题目思路与知识点总结 | 豆包MarsCode AI刷题
原问题
问题描述
小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:
- 小写字母按以下映射关系进行转换:
a, b, c->2d, e, f->3g, h, i->4j, k, l->5m, n, o->6p, q, r, s->7t, u, v->8w, x, y, z->9
- 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,
B转换为a,再转换为2;A特殊处理,先变为Z,再转换为9。 - 非字母字符保持不变。
例如:对于输入字符串 "LIming0701",转换后的数字密码为 5464640701。
测试样例
样例1:
输入:
s = "LIming0701"
输出:'5464640701'
样例2:
输入:
s = "PassW0rd"
输出:'62778073'
样例3:
输入:
s = "helloWORLD123"
输出:'4355686752123'
问题解构
具体要求
转换字符串,小写字母按照题目要求转换,大写字母转换成小写字母后跳到前一个小写字母(a变z)然后按小写字母转换,非字母不转换,给定字符串,输出转换后的字符串。
输入输出
输入:转换前的字符串
输出:转换后的字符串
题目类型分析
这是一道字符转换题目,考察对字符的转换能力。
思路
模块化编程,用一个函数处理从小写字母转换成目标字符,用一个函数处理从大写字母转换成相应小写字母,再在主要的solution函数里完成主要逻辑步骤。
代码逻辑
一层逻辑
- 函数:根据字符转换成数字
- 函数:处理大写字母的特殊转换
- 函数:解决主要逻辑
二层逻辑
- 函数:根据字符转换成数字
- 按照规则用if逻辑进行转换
- 函数:处理大写字母的特殊转换
- 将大写字母转换成小写字母(tolower函数)
- 根据字母表位置做前一个字母的转换
- 函数:解决主要逻辑
- 遍历字符串
- 如果是字母字符
- 如果是大写字母
- 对大写字母作特殊处理
- 对字母进行转换后加入结果字符串
- 如果是大写字母
- 否则直接加入结果字符串
- 如果是字母字符
- 遍历字符串
代码
#include <iostream>
#include <string>
// 函数:根据字符转换成数字
char convertCharToDigit(char c) {
if (c >= 'a' && c <= 'c')
return '2';
if (c >= 'd' && c <= 'f')
return '3';
if (c >= 'g' && c <= 'i')
return '4';
if (c >= 'j' && c <= 'l')
return '5';
if (c >= 'm' && c <= 'o')
return '6';
if (c >= 'p' && c <= 's')
return '7';
if (c >= 't' && c <= 'v')
return '8';
if (c >= 'w' && c <= 'z')
return '9';
return c; // 非字母字符不变
}
// 函数:处理大写字母的特殊转换
char processUpperCase(char c) {
// 将大写字母转为小写字母
c = std::tolower(c);
// 根据字母表位置做前一个字母的转换
if (c == 'a')
return 'z'; // 'A'特殊处理,变为'Z'
return c - 1; // 其他字母转为前一个字母
}
std::string solution(const std::string &s) {
// write code here
std::string result;
// 遍历字符串s
for (char c : s) {
if (std::isalpha(c)) {
if (std::isupper(c)) {
// 对大写字母进行特殊处理
c = processUpperCase(c);
}
// 转换小写字母或经过特殊处理后的字母为对应数字
result += convertCharToDigit(c);
} else {
// 非字母字符直接添加到结果中
result += c;
}
}
return result;
}
int main() {
std::cout << (solution("LIming0701") == "5464640701") << std::endl;
std::cout << (solution("PassW0rd") == "62778073") << std::endl;
std::cout << (solution("helloWORLD123") == "4355686752123") << std::endl;
return 0;
}
代码涉及知识的解释
tolower()
std::tolower 是 C++ 标准库中的一个函数,用于将大写字母转换为小写字母。它定义在 <cctype> 头文件中。
函数原型
int std::tolower(int c);
参数
c:要转换的字符,类型为int。
返回值
- 如果
c是一个大写字母('A' 到 'Z'),则返回对应的小写字母('a' 到 'z')。 - 如果
c不是大写字母,则返回c本身。
isalpha()
std::isalpha 是 C++ 标准库中的一个函数,用于检查一个字符是否是字母字符(即大写或小写字母)。它定义在 <cctype> 头文件中。
函数原型
int std::isalpha(int c);
参数
c:要检查的字符,类型为int。
返回值
- 如果
c是一个字母字符('A' 到 'Z' 或 'a' 到 'z'),则返回一个非零值(通常是true)。 - 如果
c不是字母字符,则返回0(通常是false)。
isupper()
std::isupper 是 C++ 标准库中的一个函数,用于检查一个字符是否是大写字母(即 'A' 到 'Z')。它定义在 <cctype> 头文件中。
函数原型
int std::isupper(int c);
参数
c:要检查的字符,类型为int。
返回值
- 如果
c是一个大写字母('A' 到 'Z'),则返回一个非零值(通常是true)。 - 如果
c不是大写字母,则返回0(通常是false)。