You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

凯撒密码加密器在线评测单测试用例失败原因排查求助

凯撒密码加密器代码问题分析

我看到你的凯撒密码实现有两个关键问题,导致部分测试用例失败,咱们一步步拆解:

问题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,提问作者Анато́лий Кузнецов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:15:42