У меня возникают трудности с этим кодом. Я пытаюсь вернуть 2d, который является обратным входному массиву. Я не уверен, как правильно это кодировать. Возможно, у кого-то может быть несколько предложений
public class arrays {
int[][] transpose(int[][] a) {
int[][] good = new int[a.length][a.length]; /* assign dimension, I want it to be the same as input */
for (int i = 0; i < a.length; i++) {
for (int k = 0; k < a[k].length; k++) { // //nested loop to go through the rows and columns
good[i][k] = a[k][i]; // /// switch elements
}
}
return good;
}
}
Вам нужно тщательно подумать, какая переменная указывает на строку, а какая - на столбец. И в каком массиве (a
или good
).
Когда я включил их в свой код, эта улучшенная версия работает:
public class Arrays {
static int[][] transpose(int[][] a) {
// Only works if a is rectangular (every row in a has the same number of columns)
int[][] good = new int[a[0].length][a.length];
for (int i = 0; i < a.length; i++) {
// Use a[i].length, not a[k].length because k will be bigger than a.length at some point.
for (int k = 0; k < a[i].length; k++) {
// i = row in 'a', column in 'good'
// k = column in 'a', row in 'good'
good[k][i] = a[i][k];
}
}
return good;
}
}
Были проблемы:
int[][] good = new int[a.length][a.length];
Здесь вы создаете квадратную матрицу в good
хотя оригиналом может быть любая форма прямоугольника (разное количество строк и столбцов). Вам нужно переключить количество строк и столбцов, поэтому new int[a[0].length][a.length]
является хорошим исправлением. (Предполагая, что все строки имеют равное количество столбцов, что требуется в матрице)for (int k = 0; k < a[k].length; k++)
Здесь k
будет увеличиваться до тех пор, пока оно не станет больше a.length
, и вы получите ArrayIndexOutOfBoundsException
Вы хотите перебрать все столбцы в строке i
, поэтому верхняя граница равна a[i].length
, а не a[k]
.good[i][k] = a[k][i]
Помните, что i
был строкой в a
, а не в good
. В good
это столбец. Поэтому вам нужно поменять свои я и k по обе стороны задания.