javascript - 我需要使用 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) 移动第一列的元素。当有内圈时,对内圈重复上述步骤。
解决方案
您只能移动数组的一部分,如下例所示,
|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'));
推荐阅读
- go - how do i minimize the amount if/else without losing any functionality?
- javascript - 制作不同大小的魔方
- android - 我应该在paypal check android sdk的用户名和密码字段中输入什么?
- pyspark - 如何在 pyspark 中进行一种热编码
- c# - WCF Webservice 使用 Stream 传递 messagecontract 并将字符串返回给客户端
- blockchain - OS X 中外部 SSD 上的比特币核心
- python - 动态检索包目录的绝对路径
- firebase - 非谷歌服务器上的 Firebase 云功能
- typescript - 升级到 typescript 4.4.2 后如何修复“错误‘JSX’未定义 no-undef’
- user-interface - 为什么像 SwiftUI 或 Flutter/Dart 或 Compose/Kotlin 这样的 UI 系统使用声明式方法而不是命令式方法来定义 GUI?