凯撒密码实现求助:rotate_text函数无法通过隐藏测试
排查你的简单替换密码代码问题
我来帮你分析下代码里导致隐藏测试失败的几个关键问题:
1. 偏移量的模运算处理不完整
你的代码只在int1 == len(loL)时才做取模,但实际上任何大于26或者小于0的偏移量都需要取模,比如偏移30(等价于偏移4)、偏移-1(等价于偏移25)。如果不处理,当偏移量过大时会出现list index out of range错误,偏移负数时会直接触发索引异常。
2. 索引越界问题
当原字母的索引加上偏移量超过25时(比如字母Z,索引25,偏移5的话25+5=30),直接访问loL[loLindex + int1]会超出列表的索引范围(列表只有0-25的索引),这时候需要用取模运算来循环回到字母表开头。
3. 未处理小写字母
你的代码只定义了大写字母表,但如果测试用例里包含小写字母(比如dog),这些字符会被直接忽略,导致输出缺失字符,不符合加密要求。
4. 未处理非字母非空格的字符
如果明文里有数字、符号(比如DOG123!),这些字符在你的代码里不会被加入结果列表,导致输出长度和原文本不一致,隐藏测试大概率包含这类用例。
修复后的代码
def rotate_text(text, n): # 定义大小写字母表 upper_alpha = ['A','B','C','D','E','F','G','H','I','J','K', 'L','M','N','O','P','Q','R','S','T','U','V', 'W','X','Y','Z'] lower_alpha = [c.lower() for c in upper_alpha] alpha_length = len(upper_alpha) # 先对偏移量做模运算,处理正负和超过26的情况 n = n % alpha_length result = [] for char in text: if char in upper_alpha: idx = upper_alpha.index(char) result.append(upper_alpha[(idx + n) % alpha_length]) elif char in lower_alpha: idx = lower_alpha.index(char) result.append(lower_alpha[(idx + n) % alpha_length]) else: # 非字母字符(包括空格、数字、符号)直接保留 result.append(char) return ''.join(result)
修复说明
- 新增了小写字母表,支持大小写字母的加密
- 对偏移量
n先做模运算,确保它始终在0-25之间 - 对每个字符的新索引用
(idx + n) % alpha_length计算,彻底避免索引越界 - 所有非字母字符(空格、数字、符号等)都直接保留,保证输出长度和原文本一致
这样修改后,应该能通过所有测试用例了。
内容的提问来源于stack exchange,提问作者Law Suit
相关产品推荐
相关产品推荐

