小T的密码变换规则

94 阅读3分钟

问题描述

小T设计了一套密码变换规则,将输入的字符串转换成一串数字密码。变换规则如下:

  1. 小写字母按以下映射关系进行转换:
  • a, b, c -> 2
  • d, e, f -> 3
  • g, h, i -> 4
  • j, k, l -> 5
  • m, n, o -> 6
  • p, q, r, s -> 7
  • t, u, v -> 8
  • w, x, y, z -> 9
  1. 大写字母先转为小写字母,再跳到字母表中的前一个字母,并按上述规则转换为对应的数字。例如,B 转换为 a,再转换为 2A 特殊处理,先变为 Z,再转换为 9
  2. 非字母字符保持不变。

例如:对于输入字符串 "LIming0701",转换后的数字密码为 5464640701


测试样例

样例1:

输入:s = "LIming0701"
输出:'5464640701'

样例2:

输入:s = "PassW0rd"
输出:'62778073'

样例3:

输入:s = "helloWORLD123"
输出:'4355686752123'

问题理解

我们需要将输入的字符串按照特定的规则转换成一串数字密码。规则包括对小写字母、大写字母和非字母字符的处理。

数据结构选择

我们可以使用一个字符串来存储最终的转换结果。对于字母的转换,我们可以使用一个映射表(例如 std::unordered_map 或 std::array)来存储字母到数字的映射关系。

算法步骤

  1. 初始化映射表:创建一个映射表,存储小写字母到数字的映射关系。

  2. 遍历输入字符串:对于每个字符,根据其类型进行不同的处理:

    • 小写字母:直接从映射表中获取对应的数字。
    • 大写字母:先转换为小写字母,然后跳到字母表中的前一个字母,再从映射表中获取对应的数字。
    • 非字母字符:保持不变。
  3. 构建结果字符串:将每个字符的处理结果拼接起来,形成最终的数字密码。

具体步骤

  1. 初始化映射表:可以使用一个数组或哈希表来存储字母到数字的映射。

  2. 遍历字符串:使用一个循环遍历输入字符串的每个字符。

  3. 处理字符

    • 如果是小写字母,直接从映射表中获取对应的数字。
    • 如果是大写字母,先转换为小写字母,然后跳到前一个字母,再从映射表中获取对应的数字。
    • 如果是非字母字符,直接添加到结果字符串中。
  4. 返回结果:将处理后的字符拼接成最终的数字密码并返回。

#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;
}