反转二维数组的每一行
Reverse each row of a 2D array
我想创建一个二维数组的反转数组,这样原始数组的每一行都反转(没有反转列)。
意思是,如果这是输入数组:
1 2 3
3 2 1
2 1 3
这就是所需的输出:
3 2 1
1 2 3
3 1 2
问题是我得到的输出是完全错误的。
这是我的代码:
public class Test {
public static void main(String[] args) {
int[][] forward = {
{ 1, 2, 3 },
{ 3, 2, 1 },
{ 2, 1, 3 }
};
int rows = forward.length;
int cols = forward[0].length;
int[][] reverse = new int[rows][cols];
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 0; j--) {
reverse[rows - 1 - i][cols - 1 - j] = forward[i][j];
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(reverse[i][j]);
if (j < cols - 1)
System.out.print(", ");
}
System.out.println();
}
}
}
I want to print reverse every row of my array
问题是在你的循环中你不仅要反转列,还要反转行
reverse[rows - 1 - i][cols - 1 - j] = forward[i][j];
这导致数组旋转 180 度。
如果您只想反转行的内容,这意味着您想要反转它们列的顺序(您已经处理过)。所以而不是
reverse[rows - 1 - i][cols - 1 - j] = forward[i][j];
使用
reverse[i][cols - 1 - j] = forward[i][j];// change only columns
// ^--------------------------^ // rows should stay the same
顺便说一句,您不必以相反的顺序遍历行或列
for (int i = rows - 1; i >= 0; i--) {
简单的前向 for 循环也可以解决问题,并且更具可读性
for (int i = 0; i < rows; i++) {
在您的反向循环中添加了以下行:
System.out.println("reverse[" + (rows - 1 - i) + "][" + (cols - 1 - j) + "] = forward[" + i + "][" + j + "]");
这就是我得到的:
reverse[0][0] = forward[2][2]
reverse[0][1] = forward[2][1]
reverse[0][2] = forward[2][0]
reverse[1][0] = forward[1][2]
reverse[1][1] = forward[1][1]
reverse[1][2] = forward[1][0]
reverse[2][0] = forward[0][2]
reverse[2][1] = forward[0][1]
reverse[2][2] = forward[0][0]
你正在做的是混合行。
您的反向循环应该遍历 forward
和 reverse
的相同行号:
for (int i = 0; i < rows; i++) {
for (int j = cols - 1; j >= 0; j--) {
reverse[i][cols - 1 - j] = forward[i][j];
}
}
这样我们就得到了想要的行为:
reverse[0][0] = forward[0][2]
reverse[0][1] = forward[0][1]
reverse[0][2] = forward[0][0]
reverse[1][0] = forward[1][2]
reverse[1][1] = forward[1][1]
reverse[1][2] = forward[1][0]
reverse[2][0] = forward[2][2]
reverse[2][1] = forward[2][1]
reverse[2][2] = forward[2][0]
我想创建一个二维数组的反转数组,这样原始数组的每一行都反转(没有反转列)。
意思是,如果这是输入数组:
1 2 3
3 2 1
2 1 3
这就是所需的输出:
3 2 1
1 2 3
3 1 2
问题是我得到的输出是完全错误的。
这是我的代码:
public class Test {
public static void main(String[] args) {
int[][] forward = {
{ 1, 2, 3 },
{ 3, 2, 1 },
{ 2, 1, 3 }
};
int rows = forward.length;
int cols = forward[0].length;
int[][] reverse = new int[rows][cols];
for (int i = rows - 1; i >= 0; i--) {
for (int j = cols - 1; j >= 0; j--) {
reverse[rows - 1 - i][cols - 1 - j] = forward[i][j];
}
}
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
System.out.print(reverse[i][j]);
if (j < cols - 1)
System.out.print(", ");
}
System.out.println();
}
}
}
I want to print reverse every row of my array
问题是在你的循环中你不仅要反转列,还要反转行
reverse[rows - 1 - i][cols - 1 - j] = forward[i][j];
这导致数组旋转 180 度。
如果您只想反转行的内容,这意味着您想要反转它们列的顺序(您已经处理过)。所以而不是
reverse[rows - 1 - i][cols - 1 - j] = forward[i][j];
使用
reverse[i][cols - 1 - j] = forward[i][j];// change only columns
// ^--------------------------^ // rows should stay the same
顺便说一句,您不必以相反的顺序遍历行或列
for (int i = rows - 1; i >= 0; i--) {
简单的前向 for 循环也可以解决问题,并且更具可读性
for (int i = 0; i < rows; i++) {
在您的反向循环中添加了以下行:
System.out.println("reverse[" + (rows - 1 - i) + "][" + (cols - 1 - j) + "] = forward[" + i + "][" + j + "]");
这就是我得到的:
reverse[0][0] = forward[2][2]
reverse[0][1] = forward[2][1]
reverse[0][2] = forward[2][0]
reverse[1][0] = forward[1][2]
reverse[1][1] = forward[1][1]
reverse[1][2] = forward[1][0]
reverse[2][0] = forward[0][2]
reverse[2][1] = forward[0][1]
reverse[2][2] = forward[0][0]
你正在做的是混合行。
您的反向循环应该遍历 forward
和 reverse
的相同行号:
for (int i = 0; i < rows; i++) {
for (int j = cols - 1; j >= 0; j--) {
reverse[i][cols - 1 - j] = forward[i][j];
}
}
这样我们就得到了想要的行为:
reverse[0][0] = forward[0][2]
reverse[0][1] = forward[0][1]
reverse[0][2] = forward[0][0]
reverse[1][0] = forward[1][2]
reverse[1][1] = forward[1][1]
reverse[1][2] = forward[1][0]
reverse[2][0] = forward[2][2]
reverse[2][1] = forward[2][1]
reverse[2][2] = forward[2][0]