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

Java实现凯撒密码ASCII字符偏移仅单测试用例通过问题排查

凯撒密码代码逻辑问题说明

你的代码恰好能通过给出的测试用例属于巧合,存在3个核心逻辑缺陷:

  • 未区分大小写字母的溢出判定:大写字母ASCII范围为65(A)~90(Z),你仅处理了小写字母溢出(ASCII>122)的场景,大写字母偏移后超过90时没有回绕逻辑,比如输入Z偏移2,你的代码会输出ASCII为92的\,而非预期的B。
  • 未对偏移量k取模26:凯撒密码偏移量超过26时等价于偏移k%26,当k大于26时,你直接用原值相加后仅减一次26根本无法完成正确回绕,会得到完全错误的字符。
  • 溢出回绕逻辑不严谨:仅对溢出值减26的处理只在溢出长度不超过26时生效,更稳妥的实现是先将字符转换为对应大小写字母表的0~25相对位置,偏移后取模26再转回ASCII,从根源避免溢出问题。

修正后代码

public static String caesarCipher(String s, int k) {
    // 先对偏移量取模26,避免k过大的问题
    k = k % 26;
    StringBuilder newString = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        char currentChar = s.charAt(i);
        if (Character.isUpperCase(currentChar)) {
            // 处理大写字母:先转到0-25区间,偏移取模后转回ASCII
            int originalPos = currentChar - 'A';
            int newPos = (originalPos + k) % 26;
            newString.append((char) ('A' + newPos));
        } else if (Character.isLowerCase(currentChar)) {
            // 处理小写字母
            int originalPos = currentChar - 'a';
            int newPos = (originalPos + k) % 26;
            newString.append((char) ('a' + newPos));
        } else {
            // 非字母字符直接保留
            newString.append(currentChar);
        }
    }
    return newString.toString();
}

内容的提问来源于stack exchange,提问作者user16225412

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:39:00