矩阵的相关问题(旋转矩阵&螺旋矩阵)
旋转矩阵(将我们的数组进行旋转90度,180度,270度)
rotate(90deg)=> 
旋转90度之后分析一下:旋转后的数组第一行等于原来数组的第一列。
代码如下
const arr = [
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16],
[17,18,19,20]
]
function rotate(arr) {
let arr2 = [];
for(let i =0; i<arr[0].length; i++) { //i是每一列的序号
let temparr = []; //存储旋转后每一行的结果
for(let j=0;j<arr.length; j++) { //j是每一行的序号
temparr.unshift(arr[j][i]); //将结果从头开始一个一个插入
}
arr2.push(temparr)
}
return arr2;
}
console.log(rotate(arr)) //旋转90deg
如果旋转180那么rotate函数调用 两遍即可。270deg以此类推
螺旋矩阵(顺时针遍历矩阵)

分析:
1.每一轮的循环都是:向右->向下->向左->向上
2.使用四个边界l,r,t,b来限定遍历的范围
3.向左走完一遍之后,上边界下移(t++);向下走完一遍之后,右边界左移(r--);向左走完一遍之后,下边界上移(b--);向上走完一遍之后,左边界右移(l++)
3.结束条件:当左边界>=右边界&&上边界>=下边界
代码如下:
onst arr =
[
[1,2,3,4],
[5,6,7,8],
[9,10,11,12],
[13,14,15,16],
[17,18,19,20]
]
function ergodic(arr) {
let t = 0;
let b = arr.length - 1;
let l = 0;
let r = arr[0].length - 1;
while(l<r||t<b) {
for(let i=l;i<=r;i++) {
//向右
console.log(arr[t][i]);
}
t++;
for(let i = t;i<=b;i++) {
//向下
console.log(arr[i][r])
}
r--;
for(let i=r;i>=l;i--) {
//向左
console.log(arr[b][i]);
}
b--;
for(let i =b;i>=t;i--) {
//向上
console.log(arr[i][l])
}
l++;
}
}
ergodic(arr)

浙公网安备 33010602011771号