Заполняйте матрицу по четырём границам, после каждой стороны сужая оставшуюся прямоугольную область.
Напишите функцию, которая принимает ширину и высоту матрицы и возвращает двумерный массив, заполненный числами по спирали (по возрастанию, начиная с 1, двигаясь вправо, затем вниз, влево, вверх).
Заполняйте матрицу по четырём границам, после каждой стороны сужая оставшуюся прямоугольную область.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Заполняйте матрицу по четырём границам, после каждой стороны сужая оставшуюся прямоугольную область.
Размеры — неотрицательные целые; при нуле в любом измерении вернём пустой массив. Проверки границ защищают центральную строку или колонку от повторной записи.
function spiral(width, height) {
if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) ||
width < 0 || height < 0) throw new RangeError('Размеры');
if (!width || !height) return [];
const a = Array.from({ length: height }, () => Array(width));
let top = 0, bottom = height - 1, left = 0, right = width - 1, n = 1;
while (top <= bottom && left <= right) {
for (let x = left; x <= right; x++) a[top][x] = n++;
top++;
for (let y = top; y <= bottom; y++) a[y][right] = n++;
right--;
if (top <= bottom) {
for (let x = right; x >= left; x--) a[bottom][x] = n++;
bottom--;
}
if (left <= right) {
for (let y = bottom; y >= top; y--) a[y][left] = n++;
left++;
}
}
return a;
}
Время и память результата — O(width × height); для внешних данных дополнительно ограничивают допустимую площадь.