如何使Python奇偶解密函数兼容奇数长度字符串?
问题分析与修复方案
你的解密函数无法处理奇数长度字符串的核心原因是没有处理加密结果末尾的单独字符,同时middle的计算可以简化(原math.ceil(messg_len // 2)等价于messg_len // 2,无需额外调用ceil)。
加密逻辑回顾
加密函数的核心逻辑是:
- 把原字符串的偶数索引字符(从0开始)存入
evens,奇数索引字符存入odds - 加密结果为
odds + evens - 若原字符串长度为奇数,额外追加原字符串的最后一个字符到加密结果末尾
解密的逆向逻辑
要解密,需要逆向这个过程:
- 拆分加密字符串为
odds段(前半部分)和evens段(后半部分,奇数长度时需排除最后一个字符) - 交替拼接
evens和odds的对应字符 - 若加密字符串长度为奇数,最后追加末尾的单独字符
修复后的解密函数
import math def encrypt(messg: str) -> str: evens = '' odds = '' for char_index in range(0, len(messg) -1, 2): evens += messg[char_index] if char_index +1 < len(messg): odds += messg[char_index + 1] encrypted = odds + evens if len(messg) % 2 != 0: encrypted += messg[-1] return encrypted def decryption(messg: str) -> str: messg_len = len(messg) k = messg_len // 2 # 等价于原math.ceil(messg_len//2),无需额外ceil decrypted = '' # 交替拼接evens段和odds段的字符 for i in range(k): decrypted += messg[k + i] + messg[i] # 处理奇数长度的情况:追加末尾的单独字符 if messg_len % 2 != 0: decrypted += messg[-1] return decrypted
测试验证
- 奇数长度测试:原字符串
abcde→ 加密后为bdace→ 解密后还原为abcde - 偶数长度测试:原字符串
abcd→ 加密后为bdac→ 解密后还原为abcd
内容的提问来源于stack exchange,提问作者wb2026
相关产品推荐
相关产品推荐

