Напишите функцию, преобразующую одномерный массив в матрицу заданного числа строк и столбцов: первый столбец заполняется сверху вниз, второй — снизу вверх, и так далее. Если размер матрицы не соответствует длине массива, нужно выбросить ошибку.

Индекс элемента определяет столбец, а строка идёт прямо для чётного столбца и в обратном порядке для нечётного.

Короткий ответ

Что ответить на собеседовании

Индекс элемента определяет столбец, а строка идёт прямо для чётного столбца и в обратном порядке для нечётного.

Подробный разбор

Ответ с пояснениями

Индекс элемента определяет столбец, а строка идёт прямо для чётного столбца и в обратном порядке для нечётного.

Здесь размеры должны быть положительными целыми:

function snakeMatrix(values, rows, cols) {
  if (!Number.isInteger(rows) || !Number.isInteger(cols) || rows <= 0 || cols <= 0 ||
    !Number.isSafeInteger(rows * cols) || rows * cols !== values.length) {
    throw new RangeError('Invalid matrix dimensions');
  }
  const matrix = Array.from({ length: rows }, () => Array(cols));
  for (let i = 0; i < values.length; i++) {
    const col = Math.floor(i / rows);
    const offset = i % rows;
    const row = col % 2 === 0 ? offset : rows - 1 - offset;
    matrix[row][col] = values[i];
  }
  return matrix;
}

Для [1,2,3,4,5,6], 2×3 результат [[1,4,5],[2,3,6]]. Время и память O(rows×cols), исходный массив не меняется.

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

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

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

Подробнее