как написать метод для реверсирования 2D-массива

#java

Вопрос:

Мне нужно решить этот вопрос

Напишите метод, который принимает двумерный массив типа integer в качестве параметра и возвращает значение, обратное массиву (строки становятся столбцами и наоборот).

это то, что я сделал с помощью поиска, но он показывает кучу ошибок

 public static class inverse{

    public static int[][] arrayInverse(int[][] A){
        int[][] B = new int[3][3];
        for(int i=0; i<B.length/2;i  ){
            for (int j=0; j<B[i].length/2;j  ) {
                int swap = B[i][j];
                B[B.length - i - 1] = swap;
            }
        }
        return swap;
    }
}
 

}

Комментарии:

1. Какие ошибки это вызывает?

2. Похоже, ты поступаешь неправильно. В вопросе не говорится об обратном массиве. Там написано поменять местами строки и столбцы.

3. Мой лучший совет-прочитать о транспонировании матрицы, geeksforgeeks.org/program-to-find-transpose-of-a-matrix

Ответ №1:

Во-первых, как упоминалось в комментариях, задача состоит в том, чтобы перенести входной массив, чтобы строки стали столбцами, и наоборот

Если входной 2D-массив квадратный (количество строк совпадает с количеством столбцов), наиболее эффективным способом было бы поменять местами элементы ниже и по главной диагонали: a[i][j] ⇄ a[j][i] без использования дополнительного массива:

 public static int[][] transposeSquare(int[][] arr) {
    for (int i = 0, n = arr.length; i < n; i  ) {
        // select the elements only above the main diagonal
        for (int j = i   1, m = arr[i].length; j < m; j  ) {
            int tmp = arr[i][j];
            arr[i][j] = arr[j][i];
            arr[j][i] = tmp;
        }
    }
    return arr;
}
 

Однако в общем случае прямоугольной матрицы может потребоваться создать новый массив/матрицу размера M x N вместо N x M , и скопировать значения из входных данных в соответствующем порядке (тогда обмен не требуется):

 public static int[][] transpose(int[][] arr) {
    int[][] result = new int[arr[0].length][arr.length];
    for (int i = 0, n = arr.length; i < n; i  ) {
        for (int j = 0, m = arr[i].length; j < m; j  ) {
            result[j][i] = arr[i][j];
        }
    }
    return resu<
}
 

Комментарии:

1. transposeSquare возвращает входные данные как есть. Вы, кажется, перемещаетесь дважды.

2. @saka1029, верно, код исправлен

Ответ №2:

Вам нужно заменить между столбцами и строками

 public class inverse {
    /**
     * The entry point of application.
     *
     * @param args the input arguments
     */
    public static void main(String[] args) {
        int ints[][] = {{1, 2, 3},
                {5, 6, 7},
                {9, 10, 11},
                {12, 13, 14}
        };
        print2D(ints);
        System.out.println("n");
        print2D(arrayInverse(ints));
    }

    /**
     * Array inverse int [ ] [ ].
     *
     * @param A the a
     * @return the int [ ] [ ]
     */
    public static int[][] arrayInverse(int[][] A) {
        if (A.length == 0 || A[0].length == 0) {
            System.out.println("A.length==0 || A[0].length==0");
            return A;
        }
        int[][] B = new int[A[0].length][A.length];
        for (int i = 0; i < B.length; i  ) {
            for (int j = 0; j < B[i].length; j  ) {
                B[i][j] = A[j][i];
            }
        }
        return B;
    }

    /**
     * Print 2 d.
     *
     * @param mat the mat
     */
    public static void print2D(int mat[][]) {
        // Loop through all rows
        for (int i = 0; i < mat.length; i  ) {

            for (int j = 0; j < mat[i].length; j  ) {
                System.out.print(mat[i][j]   " ");
            }
            System.out.println(" ");
        }
    }
}
 

Выход:

1 2 3
5 6 7
9 10 11
12 13 14

1 5 9 12
2 6 10 13
3 7 11 14

Комментарии:

1. А как насчет массива 4×4? Или массив, в котором количество строк и столбцов разное?

2. @JoakimDanielson Ответ обновлен и поддерживается разная длина.

Ответ №3:

Вот общее решение. Он транспонирует любую матрицу, в том числе и неровную.

 List<int[][]> demo = List.of(
        new int[][] { { 1 }, { 2, 3, 4 }, { 5, 6 } },
        new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } },
        new int[][] { { 1, 2, 3, 4, 5 },
                { 6, 7, 8, 9, 10 } });

for (int[][] arr : demo) {
    System.out.println("Original");
    for (int[] b : arr) {
        System.out.println(Arrays.toString(b));
    }
    System.out.println("Transposed");
    for (int[] b : transpose(arr)) {
        System.out.println(Arrays.toString(b));
    }
    System.out.println();
}
 

С принтами

 Original
[1]
[2, 3, 4]
[5, 6]
Transposed
[1, 2, 5]
[3, 6]
[4]

Original
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Transposed
[1, 4, 7]
[2, 5, 8]
[3, 6, 9]

Original
[1, 2, 3, 4, 5]
[6, 7, 8, 9, 10]
Transposed
[1, 6]
[2, 7]
[3, 8]
[4, 9]
[5, 10]
 
  • сначала найдите полученное количество строк, которое является максимальным количеством столбцов в исходной матрице.
  • Затем просто выполните итерацию по матрице, создавая новые строки и копируя соответствующие значения каждого столбца в их новую строку. Поскольку строки могут быть разной длины, проверяется, существует ли значение в текущей строке.
  • затем скопируйте эту строку нужной длины в транспонированную строку.
 public static int[][] transpose(int[][] nums) {
    int maxRows = nums[0].length;
    for (int[] ar : nums) {
        maxRows = Math.max(maxRows, ar.length);
    }
    int[][] trans = new int[maxRows][];
    for (int r = 0; r < maxRows; r  ) {
        int[] row = new int[nums.length];
        int cc = 0;
        for (int c = 0; c < row.length; c  ) {
            if (r < nums[c].length) {
                row[cc  ] = nums[c][r];
            }
        }
        trans[r] = Arrays.copyOf(row, cc);
    }
    return trans;
}
 

С принтами