Answer
t.me/js_testОтвет:
function spiralMatrix(n) {
const arr = Array.from({ length: n }, () => []);
let row = 0;
let col = 0;
let rowEnd = n - 1;
let colEnd = n - 1;
let counter = 1;
while (col <= colEnd && row <= rowEnd) {
for (let i = col; i <= colEnd; i++) {
arr[row][i] = counter;
counter++;
}
row++;
for (let i = row; i <= rowEnd; i++) {
arr[i][colEnd] = counter;
counter++;
}
colEnd--;
for (let i = colEnd; i >= col; i--) {
arr[rowEnd][i] = counter;
counter++;
}
rowEnd--;
for (let i = rowEnd; i >= row; i--) {
arr[i][col] = counter;
counter++;
}
col++;
}
return arr;
}
Объяснение:
Инициализируем нашу матрицу с помощью метода Array.from, далее заводим 4 переменных row, col, rowEnd, colEnd - они нужны для спиральной индексации по матрице и переменную counter - это будут значения матрицы. Затем пока col <= colEnd и row <= rowEnd заполняем линиями матрицу в таком порядке: верхнюю, правую, нижнюю и левую, каждый раз меняя значения переменных для индексации.
Код для проверки:
function spiralMatrix(n) {
const arr = Array.from({ length: n }, () => []);
let row = 0;
let col = 0;
let rowEnd = n - 1;
let colEnd = n - 1;
let counter = 1;
while (col <= colEnd && row <= rowEnd) {
for (let i = col; i <= colEnd; i++) {
arr[row][i] = counter;
counter++;
}
row++;
for (let i = row; i <= rowEnd; i++) {
arr[i][colEnd] = counter;
counter++;
}
colEnd--;
for (let i = colEnd; i >= col; i--) {
arr[rowEnd][i] = counter;
counter++;
}
rowEnd--;
for (let i = rowEnd; i >= row; i--) {
arr[i][col] = counter;
counter++;
}
col++;
}
return arr;
}
console.log(spiralMatrix(2));
/*
[
[ 1, 2 ],
[ 4, 3 ]
]
*/
console.log(spiralMatrix(3));
/*
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]
*/
console.log(spiralMatrix(5));
/*
[
[ 1, 2, 3, 4, 5 ],
[ 16, 17, 18, 19, 6 ],
[ 15, 24, 25, 20, 7 ],
[ 14, 23, 22, 21, 8 ],
[ 13, 12, 11, 10, 9 ]
]
*/