Напишите функцию, которая принимает ширину и высоту матрицы и возвращает двумерный массив, заполненный числами по спирали (по возрастанию, начиная с 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); для внешних данных дополнительно ограничивают допустимую площадь.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее