这是我在这里的第一篇文章,因此请原谅任何格式错误等。
所以基本上我很难实现采用给定数组并将其顺时针旋转90度的方法。我们应该使用属性“ imp”来实现所有给定的方法,如下所示:
class Matrix {
int[][] imp;
/* All methods in Matrix are implemented in terms of ’imp’ */
}
这是我到目前为止在方法实现中所拥有的:
/**
* <p> Rotate the matrix by 90 degrees.
* <p> The old 1st row becomes the new last column,
* the old 2nd row becomes the new 2nd last column, and so on.
* <p> Hint: attribute 'imp' should be reassigned to a new matrix.
* <p> See TestMatrix class for how this method can be used.
*/
public void rotateClockwise() {
int rows = imp.length;
int cols = imp[0].length;
int[][] m2 = new int[cols][rows];
int i = 0;
int j = 0;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
m2[i][rows - 1 - i] = imp[i][j];
}
}
imp = m2;
}
这是用于测试我的方法的测试用例:
@Test
public void test18_RotateClockwise() {
Matrix m1 = new Matrix(3, 4);
int[] nr0 = {1 , 2 , 3 , 4 };
int[] nr1 = {5 , 6 , 7 , 8 };
int[] nr2 = {9 , 10, 11, 12};
m1.setRow(0, nr0);
m1.setRow(1, nr1);
m1.setRow(2, nr2);
int[] nc0 = {9, 10, 11, 12};
int[] nc1 = {5, 6 , 7 , 8 };
int[] nc2 = {1, 2 , 3 , 4 };
int[] nr0_ = {12, 11 , 10 , 9 };
int[] nr1_ = {8 , 7 , 6 , 5 };
int[] nr2_ = {4 , 3 , 2 , 1 };
m1.rotateClockwise();
assertArrayEquals(nc0, m1.getColumn(0));
assertArrayEquals(nc1, m1.getColumn(1));
assertArrayEquals(nc2, m1.getColumn(2));
m1.rotateClockwise();
assertArrayEquals(nr0_, m1.getRow(0));
assertArrayEquals(nr1_, m1.getRow(1));
assertArrayEquals(nr2_, m1.getRow(2));
}
我了解测试用例正在尝试做的事情,并且我的代码可以编译并且没有任何异常或错误,但是我得到的输出错误是这样的:
arrays first differed at element [0]; expected:<9> but was:<0>
我假设这意味着我基本上是在旋转一个空数组。我想我的问题是如何将阵列从测试用例放入我的方法中进行旋转?我尝试使用getRow和getColumn方法,但收到一条错误消息,告诉我不能在属性imp上调用这些方法。任何帮助表示赞赏。谢谢!
答案 0 :(得分:2)
我认为这行是不正确的,因为将值写入的位置也肯定也取决于j
:
m2[i][rows - 1 - i] = imp[i][j];
我还没有测试过,但这可能是一个工作版本:
m2[j][rows - 1 - i] = imp[i][j];
编辑:
为什么j
应该是第一个索引而不是i
?
内部循环遍历原始矩阵内一行的元素。这些元素应插入到新矩阵的同一列中,但应位于不同的行中。当前元素插入的行的索引应随原始矩阵中该元素的列索引增加而增加。 j
代表原始矩阵中的列索引,因此它应代表新的/旋转矩阵中的行索引。
答案 1 :(得分:0)