青训营X豆包MarsCode 技术训练营第(二)课 | 豆包MarsCode AI 刷题

116 阅读4分钟

给大家分享一下我最近刷的几道题的解析,还有我对ai助手的使用心得,这是第一次给大家分享的刷题解析和经验分享,这个系列预计有六期,今天给大家带来第二期的分享。

今天的第一题——字符串的加密解密

问题描述

小C定义了一种加密方式:对于给定的原始字符串 S,将其中每个字母替换为其三重后继,即字母表中该字母的后三个字母。字母 'a' 的三重后继是 'd',字母 'z' 的三重后继是 'c'。现在给定一个加密后的字符串 S',需要通过解密得出原始的字符串 S

例如,对于加密后的字符串 "def",其原始字符串应该是 "abc"


测试样例

样例1:

输入:n = 3 ,s = "def"
输出:'abc'

样例2:

输入:n = 5 ,s = "xyzab"
输出:'uvwxy'

样例3:

输入:n = 4 ,s = "hijk"
输出:'efgh'

解决方案

要解密加密后的字符串 S',我们可以按照以下步骤进行:

  1. 遍历加密字符串的每个字符:我们需要处理每个字母,将其转换回原字符。

  2. 计算原字母

    • 对于每个字符 c,原字母是将 c 的 ASCII 值减去 3。即:original_char=c−3original_char=c−3
  • 但是,当字母是 'a'、'b' 或 'c' 时,需要考虑循环:

    • 如果 c 是 'a',则原字符应为 'x'
    • 如果 c 是 'b',则原字符应为 'y'
    • 如果 c 是 'c',则原字符应为 'z'
  1. 拼接解密后的字符:将所有解密后的字符拼接成一个原始字符串。
    public static String solution(int n, String s) {
        StringBuilder result = new StringBuilder();
        
        for (char c : s.toCharArray()) {
            // 计算三重前驱
            char decryptedChar = (char) (c - 3);
            if (c < 'd') {
                decryptedChar = (char) ('z' - ('c' - c));
            }
            
            // 将解密后的字符添加到结果字符串中
            result.append(decryptedChar);
        }
        
        return result.toString();
    }

    public static void main(String[] args) {
        System.out.println(solution(3, "def").equals("abc"));
        System.out.println(solution(5, "xyzab").equals("uvwxy"));
        System.out.println(solution(4, "hijk").equals("efgh"));
    }
}

代码功能概述

这段代码主要实现了一个字符解密功能,采用了简单的字符转换方法:通过将每个字符向前移动三个位置,这种方式常见于凯撒密码(Caesar cipher)。也就是说,输入的每个字母会被替换为它前面的第三个字母,比如 ‘d’ 将变成 ‘a’,‘e’ 变成 ‘b’,依此类推。当字符是 'a'、'b' 或 'c' 时,则会绕回从 'z' 开始的字符。

代码细节

  1. 类定义与函数布局

    • Main 是一个包含 solution 方法的公开类。solution 方法接收一个整数 n 和字符串 s 作为参数,并返回解密后的字符串。
    • 使用 StringBuilder 作为结果字符串,以优化字符串拼接的性能。
  2. 字符处理逻辑

    • for (char c : s.toCharArray()):通过字符数组遍历输入字符串的每个字符。

    • char decryptedChar = (char) (c - 3):这个行将字符 c 的 ASCII 值减去 3,生成解密后的字符。

    • if (c < 'd') { decryptedChar = (char) ('z' - ('c' - c)); }:此判断解决了字符循环的问题。当字符 c 是 'a'、'b' 或 'c' 时,通过绕回实现正确的解密逻辑。例如:

      • 当 c 是 'c' 时,解密后的字符应为 'z'。
      • 当 c 是 'b' 时,解密后的字符应为 'y'。
      • 当 c 是 'a' 时,解密后的字符应为 'x'。
  3. 结果拼接与返回

    • 将解密后的字符 decryptedChar 添加到 result 中,最终返回 result.toString() 作为解密字符串。

核心逻辑

这段代码的核心在于基于 ASCII 码的字符按位操作,解决了字符解密时

的循环逻辑问题。具体来说:

  • 通过减少 ASCII 码来实现字符向前移动的操作。
  • 处理字符 'a'、'b' 和 'c' 的特殊情况,确保它们能正确地移回到字母表的后面部分。

由于字符的解密过程是线性的,因此算法的时间复杂度为 O(N),其中 N 是输入字符串的长度。

总结

这段代码充分利用了简单的数学操作和条件判断来实现字符的解密,通过字符的 ASCII 码的直接操作,使得逻辑清晰且运行高效。这不仅加强了对字符串处理的理解,也让我们看到了如何应对字符的循环逻辑。

我对 AI 助手的使用心得

在进行这道题的编程与算法学习的过程中,豆包AI 助手成为我重要的解题工具,帮助我在遇到困惑时及时找到方向。尤其是在处理算法时,AI 给我提供更加高效和简洁的思路。AI 助手为我的学习和编程旅程增添了许多便利与乐趣。它不仅是一个知识的源泉,也是一个引导我深入探索技术的伙伴。希望我的这些体会能帮助到同样在编程之路上前行的人们!