反转二维数组
Inverting a two-dimensional array
我正在尝试反转和翻转二维数组,但出了点问题!翻转工作正常,但反转不是。
在这里找不到错误:
public int[][] flipAndInvert(int[][] A) {
int row = -1;
int col = -1;
int[][] arr = A;
for (int i = 0; i < arr.length; i++) {
row++;
col = -1;
for (int j = arr[i].length - 1; j >= 0; j--) {
col++;
arr[row][col] = A[i][j];
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] == 1) {
arr[i][j] = 0;
} else {
arr[i][j] = 1;
}
}
}
return arr;
}
int[][] A = { { 0, 1, 1 },{ 0, 0, 1 },{ 0, 0, 0 } };
执行后输出应该是:
反转后:
{1,1,0},{1,0,0},{0,0,0}
翻转后:
{0,0,1,},{0,1,1},{1,1,1}
感谢大家,问题出在这里:
int[][] arr = A;
数组的引用正在传递给 arr.
使用 apache 通用语言:
int[][] matrix = new int[3][3];
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 3 * i;
matrix[i][1] = 3 * i + 1;
matrix[i][2] = 3 * i + 2;
}
System.out.println(Arrays.toString(matrix[0]));
System.out.println(Arrays.toString(matrix[1]));
System.out.println(Arrays.toString(matrix[2]));
ArrayUtils.reverse(matrix);
System.out.println(Arrays.toString(matrix[0]));
System.out.println(Arrays.toString(matrix[1]));
System.out.println(Arrays.toString(matrix[2]));
希望对您有所帮助。
我的想法是,既然你正在使用这条线:
int[][] arr = A;
数组的引用被传递给arr,因此行:
arr[row][col] = A[i][j];
相当于:
A[row][col] = A[i][j];
因为 arr 有一个对 A 的引用,它们现在都引用相同的内存位置(或者它们对于单个变量都是不同的名称)
您可以通过在 arr 中使用 new 关键字然后对其进行初始化来解决此问题:
int[][] arr = new int[someRows][someCols];
//use for loop to assign the value to each element of arr
或者你可以 运行 for 循环直到 arr[i].length/2 - 1:
for (int i = 0; i < arr.length; i++) {
row++;
col = -1;
for (int j = arr[i].length / 2 - 1; j >= 0; j--) { //here changed arr[i].length to arr[i].length / 2
col++;
arr[row][col] = A[i][j]; //for this you do not need arr and you can directly work on A and return it
}
}
你的代码的问题应该是这一行:
int[][] arr = A;
您正在将数组 A
的引用分配给 arr
,从那时起,当您修改一个数组时,您修改了两个数组,或者更好的是,它们一起修改,因为它们引用相同的地址。
我正在尝试反转和翻转二维数组,但出了点问题!翻转工作正常,但反转不是。 在这里找不到错误:
public int[][] flipAndInvert(int[][] A) {
int row = -1;
int col = -1;
int[][] arr = A;
for (int i = 0; i < arr.length; i++) {
row++;
col = -1;
for (int j = arr[i].length - 1; j >= 0; j--) {
col++;
arr[row][col] = A[i][j];
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
if (arr[i][j] == 1) {
arr[i][j] = 0;
} else {
arr[i][j] = 1;
}
}
}
return arr;
}
int[][] A = { { 0, 1, 1 },{ 0, 0, 1 },{ 0, 0, 0 } };
执行后输出应该是: 反转后: {1,1,0},{1,0,0},{0,0,0} 翻转后: {0,0,1,},{0,1,1},{1,1,1}
感谢大家,问题出在这里: int[][] arr = A; 数组的引用正在传递给 arr.
使用 apache 通用语言:
int[][] matrix = new int[3][3];
for (int i = 0; i < matrix.length; i++) {
matrix[i][0] = 3 * i;
matrix[i][1] = 3 * i + 1;
matrix[i][2] = 3 * i + 2;
}
System.out.println(Arrays.toString(matrix[0]));
System.out.println(Arrays.toString(matrix[1]));
System.out.println(Arrays.toString(matrix[2]));
ArrayUtils.reverse(matrix);
System.out.println(Arrays.toString(matrix[0]));
System.out.println(Arrays.toString(matrix[1]));
System.out.println(Arrays.toString(matrix[2]));
希望对您有所帮助。
我的想法是,既然你正在使用这条线:
int[][] arr = A;
数组的引用被传递给arr,因此行:
arr[row][col] = A[i][j];
相当于:
A[row][col] = A[i][j];
因为 arr 有一个对 A 的引用,它们现在都引用相同的内存位置(或者它们对于单个变量都是不同的名称)
您可以通过在 arr 中使用 new 关键字然后对其进行初始化来解决此问题:
int[][] arr = new int[someRows][someCols];
//use for loop to assign the value to each element of arr
或者你可以 运行 for 循环直到 arr[i].length/2 - 1:
for (int i = 0; i < arr.length; i++) {
row++;
col = -1;
for (int j = arr[i].length / 2 - 1; j >= 0; j--) { //here changed arr[i].length to arr[i].length / 2
col++;
arr[row][col] = A[i][j]; //for this you do not need arr and you can directly work on A and return it
}
}
你的代码的问题应该是这一行:
int[][] arr = A;
您正在将数组 A
的引用分配给 arr
,从那时起,当您修改一个数组时,您修改了两个数组,或者更好的是,它们一起修改,因为它们引用相同的地址。