Answer

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 ]
  ] 
*/

Report Page