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

编写简单列置换密码程序求助:代码问题排查与修正

列置换密码代码修正

你的原代码存在几个关键问题:矩阵维度初始化错误、循环边界越界、字符索引计算逻辑错误,还未处理文本补空格和按列读取的核心置换逻辑。以下是修正后的完整代码,完全符合你给出的输入输出要求:

public static String transpositionCipher(String text, int N) {
    // 计算列数:向上取整得到每行需要的字符数
    int cols = (int) Math.ceil((double) text.length() / N);
    // 计算需要补充的空格数,确保总字符数为N*cols
    int padding = N * cols - text.length();
    
    // 构建填充后的文本,不足的补空格
    StringBuilder paddedText = new StringBuilder(text);
    for (int i = 0; i < padding; i++) {
        paddedText.append(' ');
    }
    String filledText = paddedText.toString();
    
    // 创建N行cols列的矩阵
    char[][] matrix = new char[N][cols];
    // 按行填充矩阵
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < cols; j++) {
            // 计算原文本中的索引:第i行第j列对应filledText的i*cols + j位置
            matrix[i][j] = filledText.charAt(i * cols + j);
        }
    }
    
    // 按列读取矩阵,拼接结果
    StringBuilder result = new StringBuilder();
    for (int j = 0; j < cols; j++) {
        for (int i = 0; i < N; i++) {
            result.append(matrix[i][j]);
        }
    }
    
    return result.toString();
}

关键修正点说明

  • 补空格处理:当原文本长度不能被行数N整除时,补充空格至总长度为N*cols,确保矩阵能完整填充。比如输入1中"New atak"长度为8,N=3,补充1个空格后变为9个字符,刚好填充3行3列的矩阵。
  • 矩阵维度与填充逻辑:矩阵维度设为N行×cols列,按行依次填充字符,索引计算为i*cols + j,确保每个字符对应矩阵的正确位置。
  • 按列读取拼接:核心置换逻辑是按列从上到下读取每一列的字符,拼接成最终密文,这也是列置换密码的核心规则。
  • 循环边界修正:原代码中i <= N会导致数组越界,修正为i < N,确保只遍历矩阵的有效行。

测试验证

  • 输入#1:text = "New atak", N = 3,执行后返回结果为"N aeakwt",与预期一致。
  • 输入#2:text = "NOS ATACAN CON CARBUNCO", N = 5,执行后返回结果与预期输出完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:50:29