Создание двумерной матрицы
Ответы (1 шт):
Во-первых, метод определён не слишком корректно, он должен либо возвращать новый квадратный массив, заполненный числами в соответствии с требованиями:
public static int[][] generate(int n) {
// ...
}
либо принимать на вход двумерный массив и заполнять его как требуется (тогда параметр, описывающий размер массива n
не является необходимым):
static void fill(int[][] arr) {
// ...
}
Задача в описанном виде подразумевает, что требуемый массив существует где-то отдельно от метода как некая глобальная переменная, к которой происходит обращение внутри метода, при этом даже название такой переменной не определено.
Также к данной задаче не относится сортировка.
Рассмотрим первый вариант решения с генерацией нужного массива как более функциональный:
- Создаём квадратный массив целых чисел размером
n × n
, сразу после создания он будет целиком заполнен нулями - Создаём внешний цикл, с двумя переменными-индексами, описывающими начало диагонали и её конец, а также инициализируем счётчик для вычисления текущего значения. Первый индекс будет увеличиваться, второй -- уменьшаться.
- В первом вложенном цикле заполняем элементы диагонали, инкрементируя счётчик, с учётом смещения
- Во втором вложенном цикле заполняем оставшиеся элементы в последнем столбце снизу вверх, также с учётом смещения
Вариант решения:
static int[][] generate(int n) {
int[][] arr = new int[n][n];
for (int left = 0, right = n - 1, count = 1; left <= right; left++, right--) {
// диагональ, начиная с первой строки и самой левой колонки
for (int r = 0, c = left; c <= right; r++, c++) {
arr[r][c] = count++;
}
// правый столбец, снизу-вверх до первой строки включительно
for (int r = right - left - 1; r >= 0; r--) {
arr[r][right] = count++;
}
}
return arr;
}
Для n = 6:
1 12 19 21 18 11
0 2 13 20 17 10
0 0 3 14 16 9
0 0 0 4 15 8
0 0 0 0 5 7
0 0 0 0 0 6
Для n = 5:
1 10 15 14 9
0 2 11 13 8
0 0 3 12 7
0 0 0 4 6
0 0 0 0 5