凯撒密码加密器在线评测单测试用例失败原因排查求助
凯撒密码加密器代码问题分析
我看到你的凯撒密码实现有两个关键问题,导致部分测试用例失败,咱们一步步拆解:
问题1:未对key进行模26处理
凯撒密码的循环周期是26个小写字母,当key远大于26时,直接用原key计算会导致字符编码超出小写字母范围(97-122)。比如:
- 输入字符为
'a'(编码97),key=100 - 原代码计算:
97+100=197,197%122=75,96+75=171,这是一个非小写字母的字符,显然不符合预期。 - 正确逻辑应该先把key对26取模:
100%26=22,97+22=119,对应'w'才是正确结果。
问题2:超出z时的计算逻辑错误
当newLetterCode是122的整数倍时,newLetterCode%122=0,此时96+0=96,对应字符是反引号(`),而不是预期的小写字母。比如:
- 输入字符为
'z'(编码122),key=122 - 原代码计算:
122+122=244,244%122=0,96+0=96,得到错误字符。 - 正确结果应该是
'r'(因为122%26=18,z+18循环后对应r)。
修正后的代码
这里是修复后的版本,核心思路是基于字母的相对位置计算,避免直接操作ASCII编码的边界问题:
public static String caesarCypherEncryptor(String str, int key) { // 先把key标准化到0-25的范围 int normalizedKey = key % 26; char[] newLetters = new char[str.length()]; for (int i = 0; i < str.length(); i++) { // 计算当前字符相对于'a'的偏移量 int currentOffset = str.charAt(i) - 'a'; // 计算新的偏移量,取模26保证循环 int newOffset = (currentOffset + normalizedKey) % 26; // 转换回ASCII编码 newLetters[i] = (char)('a' + newOffset); } return new String(newLetters); }
这个版本不管key多大,或者字符接近z的情况,都能正确循环到对应的小写字母,应该能通过所有测试用例。
内容的提问来源于stack exchange,提问作者Анато́лий Кузнецов
相关产品推荐
相关产品推荐

