226小T的密码变换规则——题目思路与知识点总结 | 豆包MarsCode AI刷题

169 阅读4分钟

226小T的密码变换规则——题目思路与知识点总结 | 豆包MarsCode AI刷题

原问题

问题描述

小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'

问题解构

具体要求

转换字符串,小写字母按照题目要求转换,大写字母转换成小写字母后跳到前一个小写字母(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)。