首页 > 解决方案 > 我需要使用 underscore.js 旋转数组的矩阵元素。我有解决方案,但代码很大我想缩短它吗?

问题描述

我使用 underscore.js 表示数组的矩阵元素。我有解决方案,但代码很大我想缩短它吗?

数组循环移位函数

function circularShift(mat) {
  let R, C;
  R = mat.length;
  for (let i = 0; i < R; i++) {
    C = mat[i].length;
  }
  let m = R, n = C;
  let row = 0, col = 0, prev = 0, curr = 0;

  if (row + 1 == m || col + 1 == n)
    return;

  prev = mat[row + 1][col];
  for (let i = col; i < n; i++) {
    curr = mat[row][i];
    mat[row][i] = prev;
    prev = curr;
  }
  row++;
  for (let i = row; i < m; i++) {
    curr = mat[i][n - 1];
    mat[i][n - 1] = prev;
    prev = curr;
  }
  n--;
  if (row < m) {
    for (let i = n - 1; i >= col; i--) {
      curr = mat[m - 1][i];
      mat[m - 1][i] = prev;
      prev = curr;
    }
  }
  m--;
  if (col < n) {
    for (let i = m - 1; i >= row; i--) {
      curr = mat[i][col];
      mat[i][col] = prev;
      prev = curr;
    }
  }
  col++;

  var finalArr = [];
  for (i = 0; i < R; i++) {
    finalArr.push(mat[i]);
  }

  console.log(finalArr)
}

//var arr = [[0, 0, 1, 2], [1, 0, 0, 1], [2, 1, 0, 1]];
var arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]];

console.log(arr);
circularShift(arr);

我的输出低于我希望使用下划线或 loadash 的代码更少

输入

1    2    3
4    5    6
7    8    9

输出:

4    1    2
7    5    3
8    9    6

从最外层开始,一个接一个地旋转所有元素环。要旋转环,我们需要执行以下操作。1)移动顶行的元素。2) 移动最后一列的元素。3)移动底行的元素。4) 移动第一列的元素。当有内圈时,对内圈重复上述步骤。

标签: javascript

解决方案


您只能移动数组的一部分,如下例所示,

|1    2|-> 3
 4    5    6
 7    8    9

那么您可以将i和的值j作为下边的起始值。

function circularShift(matrix) {
    var result = matrix.map(a => a.slice()),
        i = 0,
        j = 0;

    for (; j < matrix[i].length - 1; j++) result[i][j + 1] = matrix[i][j];
    for (; i < matrix.length - 1;    i++) result[i + 1][j] = matrix[i][j];
    for (; j > 0;                    j--) result[i][j - 1] = matrix[i][j];
    for (; i > 0;                    i--) result[i - 1][j] = matrix[i][j];
    return result;
}

var arr = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]];

console.log(arr.map(a => a.join(' ')).join('\n'));
console.log(circularShift(arr).map(a => a.join(' ')).join('\n'));


推荐阅读