我想我忽略了关于Java的一些基本内容,我不知道为什么下面的代码不能工作,我的步骤:
<
static void transpose(int[][] matrix) {
int[][] temp = matrix.clone();
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
matrix[i][j] = temp[j][i];
}
}
}发布于 2020-10-17 20:25:29
问题是使用函数clone(),因为这将创建一个只共享行数组的新矩阵。
使用相同的代码样式,这是有效的:
int[][] temp = new int[2][2];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
temp[i][j] = matrix[j][i];
}
}注意,由于temp是一个空矩阵,所以比较将是temp = matrix。
所以这适用于一个简单的2x2矩阵,但是如果您需要其他维度,而不是
int[][] temp = new int[2][2];使用
int[][] temp = new int[matrix[0].length][matrix.length];顺便说一下,更新基准内存的矩阵不是一个好的做法。我认为您的方法应该返回temp矩阵。
一个完整的更新,一个更好的方法可能是这个。几乎和你拥有的一样,但它可以接受不同的长度。
public static int[][] transpose(int [][] matrix){
int[][] temp = new int[matrix[0].length][matrix.length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
temp[j][i] = matrix[i][j];
}
}
return temp;
}发布于 2020-12-18 06:31:07
您可以使用IntStream而不是for循环
public static void main(String[] args) {
int[][] m1 = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}};
int[][] m2 = transpose(m1);
Arrays.stream(m2).map(Arrays::toString).forEach(System.out::println);
// [1, 4, 7]
// [2, 5, 8]
// [3, 6, 9]
}static int[][] transpose(int[][] matrix) {
return IntStream.range(0, matrix.length).mapToObj(i ->
IntStream.range(0, matrix[i].length).map(j ->
matrix[j][i]).toArray())
.toArray(int[][]::new);
}https://stackoverflow.com/questions/64406758
复制相似问题