问题描述
小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'
问题理解
我们需要将输入的字符串按照特定的规则转换成一串数字密码。规则包括对小写字母、大写字母和非字母字符的处理。
数据结构选择
我们可以使用一个字符串来存储最终的转换结果。对于字母的转换,我们可以使用一个映射表(例如 std::unordered_map 或 std::array)来存储字母到数字的映射关系。
算法步骤
-
初始化映射表:创建一个映射表,存储小写字母到数字的映射关系。
-
遍历输入字符串:对于每个字符,根据其类型进行不同的处理:
- 小写字母:直接从映射表中获取对应的数字。
- 大写字母:先转换为小写字母,然后跳到字母表中的前一个字母,再从映射表中获取对应的数字。
- 非字母字符:保持不变。
-
构建结果字符串:将每个字符的处理结果拼接起来,形成最终的数字密码。
具体步骤
-
初始化映射表:可以使用一个数组或哈希表来存储字母到数字的映射。
-
遍历字符串:使用一个循环遍历输入字符串的每个字符。
-
处理字符:
- 如果是小写字母,直接从映射表中获取对应的数字。
- 如果是大写字母,先转换为小写字母,然后跳到前一个字母,再从映射表中获取对应的数字。
- 如果是非字母字符,直接添加到结果字符串中。
-
返回结果:将处理后的字符拼接成最终的数字密码并返回。
#include <iostream>
#include <string>
#include <unordered_map>
std::string solution(const std::string& s) {
// 初始化字母到数字的映射表
std::unordered_map<char, char> letterToDigit = {
{'a', '2'}, {'b', '2'}, {'c', '2'},
{'d', '3'}, {'e', '3'}, {'f', '3'},
{'g', '4'}, {'h', '4'}, {'i', '4'},
{'j', '5'}, {'k', '5'}, {'l', '5'},
{'m', '6'}, {'n', '6'}, {'o', '6'},
{'p', '7'}, {'q', '7'}, {'r', '7'}, {'s', '7'},
{'t', '8'}, {'u', '8'}, {'v', '8'},
{'w', '9'}, {'x', '9'}, {'y', '9'}, {'z', '9'}
};
std::string result;
// 遍历输入字符串
for (char c : s) {
if (std::islower(c)) {
// 小写字母直接从映射表中获取对应的数字
result += letterToDigit[c];
} else if (std::isupper(c)) {
// 大写字母先转换为小写字母,然后跳到前一个字母
char lower = std::tolower(c);
if (lower == 'a') {
lower = 'z'; // 特殊处理 'A' -> 'Z'
} else {
lower = lower - 1; // 跳到前一个字母
}
result += letterToDigit[lower];
} 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;
}