如何对二维数组中的元素进行指定位数的移位操作?
二维数组每行循环右移的正确实现
首先明确需求:对二维数组的每一行进行指定位数的循环右移,超出右侧边界的元素从左侧补入,同时不能使用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
相关产品推荐
相关产品推荐

