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

如何对二维数组中的元素进行指定位数的移位操作?

二维数组每行循环右移的正确实现

首先明确需求:对二维数组的每一行进行指定位数的循环右移,超出右侧边界的元素从左侧补入,同时不能使用java.util包及ArrayList。

核心逻辑

对于每行长度为width的数组,每个元素的原位置j经过shift位右移后的新位置为:

int newJ = (j + shift) % width;

如果shift大于width,先通过取模简化移位次数(比如移13位和移2位在宽度11的数组上效果一致):

shift = shift % width;
if (shift < 0) shift += width; // 处理负移位(左移)的情况

完整代码实现

public class ArrayShift {
    public static void main(String[] args) {
        // 定义数组参数,行高4,列宽11
        int rows = 4;
        int width = 11;
        // 初始化原数组
        char[][] original = new char[rows][width];
        // 填充空字符
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < width; j++) {
                original[i][j] = ' ';
            }
        }
        // 填充图案
        original[1][0] = 'X';
        original[1][1] = 'X';
        original[1][2] = 'X';
        original[1][3] = 'X';
        original[1][4] = 'X';
        
        original[2][0] = 'X';
        original[2][4] = 'X';
        
        original[3][0] = 'X';
        original[3][1] = 'X';
        original[3][2] = 'X';
        original[3][3] = 'X';
        original[3][4] = 'X';

        // 指定移位位数,这里可以替换为输入值
        int shift = 8;
        // 简化移位次数
        shift = shift % width;
        if (shift < 0) {
            shift += width;
        }

        // 初始化目标数组
        char[][] shifted = new char[rows][width];
        // 先填充空字符
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < width; j++) {
                shifted[i][j] = ' ';
            }
        }

        // 执行移位逻辑
        for (int i = 0; i < rows; i++) {
            for (int j = 0; j < width; j++) {
                int newJ = (j + shift) % width;
                shifted[i][newJ] = original[i][j];
            }
        }

        // 打印原数组
        System.out.println("原数组:");
        printArray(original);
        // 打印移位后的数组
        System.out.println("\n移位" + shift + "位后:");
        printArray(shifted);
    }

    // 自定义打印二维数组的方法(代替Arrays.deepToString)
    private static void printArray(char[][] array) {
        for (char[] row : array) {
            System.out.print("[");
            for (int j = 0; j < row.length; j++) {
                System.out.print("'" + row[j] + "'");
                if (j != row.length - 1) {
                    System.out.print(", ");
                }
            }
            System.out.println("]");
        }
    }
}

对之前错误代码的分析

  • 你的代码问题:

    • 直接使用j + shift会导致数组越界(当j + shift >= width时),没有处理循环边界的逻辑;
    • 目标数组可能未初始化(比如没有先填充空字符),或移位逻辑错误导致输出异常;
    • 使用了Arrays.deepToString,违反了不能用java.util包的要求。
  • StackOverflow代码问题:

    • System.arraycopy是用来复制整个行的,不是每行内的元素移位,逻辑方向错误;
    • 同样没有处理j + shift超出边界的情况,会触发数组越界异常;
    • 同样使用了Arrays.deepToString,不符合作业要求。

验证结果

  • 移位2位时,第二行的X会从索引0-4移动到2-6,和你给出的示例一致;
  • 移位8位时,第二行的X会分散到索引0-1和8-10,完全匹配你的期望输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 08:30:24