字符串的加密解密 | 豆包MarsCode AI刷题

155 阅读3分钟

问题描述

小C发明了一种字符串加密方法:将原始字符串中的每个字母替换为其在字母表中向后数第三个字母。现在给定加密后的字符串,需要解密还原出原始字符串。

加密规则:

  • 每个字母向后移动3位
  • 字母表循环:'z' 后接 'a'
  • 例如:'a' -> 'd', 'y' -> 'b', 'z' -> 'c'

问题解决

首先,我向豆包询问了这道题的解题思路,得到如下回答:

"这道题可以从以下几个角度思考:

  1. 首先,这是一个解密问题,我们需要将每个字母向前移动3位
  2. 需要注意字母表是循环的,比如'a'向前移动会到'z'
  3. 我们可以使用ASCII码来处理字符移位

基于这个思路,我写出了第一版代码:

def solution(n: int, s: str) -> str:
    result = []  
    for c in s:  
        new_pos = ord(c) - 3  
        if new_pos < ord('a'):  
            new_pos += 26  
        result.append(chr(new_pos))  
    return ''.join(result)

然后我让豆包对我的代码进行了一下检查,它指出了以下几点需要改进的地方:

"你的基本思路是对的,但有几点可以优化:

  1. 参数n似乎没有被使用,可以考虑移除
  2. 建议添加输入验证,确保输入字符串只包含小写字母
  3. 可以添加文档字符串来说明函数功能
  4. 考虑使用常量来提高代码可维护性"

基于此,我对上面的代码进行了优化:

def solution(s: str) -> str:  
    """  
    解密字符串,将每个字母向前移动3位  
    
    参数:  
    s: str, 加密后的字符串  
    
    返回:  
    str: 解密后的原始字符串  
    """  
    # 定义常量  
    SHIFT = 3  
    ALPHABET_SIZE = 26  
    
    # 输入验证  
    if not all(c.islower() for c in s):  
        raise ValueError("输入必须只包含小写字母")  
    
    result = []  
    for c in s:  
        # 向前移动3位  
        new_pos = ord(c) - SHIFT  
        # 处理循环情况  
        if new_pos < ord('a'):  
            new_pos += ALPHABET_SIZE  
        result.append(chr(new_pos))  
        
    return ''.join(result)

最后,豆包还提醒我:
"这种字符串处理问题中,要特别注意:

  1. 字符的循环处理
  2. 边界情况的处理
  3. 代码的可读性和可维护性
  4. 输入验证的重要性"

学习心得

通过与豆包的交互学习这道题,我对字符串处理问题有了更深的理解。虽然这是一道相对简单的题目,但它体现了编写高质量代码所需要考虑的多个方面。

最初我只关注了基本功能的实现,通过ASCII码运算来处理字符移位。但在与豆包的交流过程中,我意识到好的代码不仅仅是实现功能那么简单。通过添加输入验证、使用常量定义、完善文档说明等改进,代码的可读性和可维护性都得到了显著提升。这让我明白了"能运行"和"好代码"之间存在着不小的差距。

在测试用例的设计上,豆包的建议也让我获益良多。一个完善的测试不应该仅仅验证正常情况,还需要考虑边界条件和特殊情况。这种思维方式不仅适用于这道题,也适用于今后遇到的其他编程问题。测试用例的设计本身就是一种发现潜在问题的过程。

总的来说,这道题让我深刻理解到:编程不仅是解决问题,更是一个不断追求代码质量的过程。好的代码应该是可读的、可维护的、经得起测试的。这些原则看似简单,但真正做到却需要在日常编程中不断积累和实践。