利用JavaScript实现蛇形矩阵
输入: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] ]
之前面试遇到这道题了,当时没有编出来,然后一直没时间尝试,今天终于抽空补上了,欠的债终于还了(小声BB)
言归正传,如给定示例,数字按照顺时针旋转填充,故可以观察出该矩阵通过旋转n圈填满整个二维矩阵。
所以我们想要填满一个num*num的二维矩阵,需要计算出旋转多少圈,然后推算出每一圈上二维数组的索引规律与元素值变化规律。代码如下:
function snakeMatrix(num) {
var row = num,col = row;
var q = Math.ceil(num / 2); // 旋转几圈
// 创建存放的数组
var result = new Array(row);
for(var i=0;i<row;i++){
result[i] = new Array(col);
}
var n = 0; // 第n+1圈
var begin = 1; // 每一圈起始值
// 第n+1圈top,right,bottom,left值
// 难点在于找到每一边上二维数组的索引变化规律
// top的索引值 result[n][n+i]
// bottom索引值 result[row-1-n][col-1-n-i]
// right、left类似
// right索引 result[n+i][col-1-n]
// left索引 result[row-1-n-i][n]
while(n <= q){
var top = col - 2 * n;
for (var i = 0; i < top; i++) {
result[n][i+n] = begin + i;
}
var right = row - 2 * n;
for (var i = 0; i < right; i++) {
result[i+n][col-n-1] = begin + top + i -1;
}
var bottom = col - 2 * n;
for (var i = 0; i < bottom; i++) {
result[row-n-1][col-n-i-1] = begin + top + right + i - 2;
}
var left = row - 2 * n - 1;
for (var i = 0; i < left; i++) {
result[row-i-n-1][n] = begin + top + right + bottom + i - 3;
}
begin += top + right + bottom + left - 3;
n++;
}
return result;
}
console.log(snakeMatrix(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 ] ]
蛇形矩阵变形
输入:[ [1, 2, 3, 4, 5],
[6, 7, 8, 9, 10],
[11,12,13,14,15],
[16,17,18,19,20],
[21,22,23,24,25] ]
输出:[ [1, 2, 3, 4, 5],
[10,15,19,25,24],
[23,22,21,16,11],
[6, 7, 8, 9, 14],
[19,18,17,12,13]]
function printMatrix(matrix)
{
var row = matrix.length;
var col = matrix[0].length;
var q = Math.ceil(row / 2);
var left = 0;
var top = 0;
var right = col - 1;
var bottom = row - 1;
var result = [];
while(top <= bottom && left <= right){
// top
for(var i=left;i<=right;i++){
result.push(matrix[top][i]);
}
// right
for(var i=top+1;i<=bottom;i++){
result.push(matrix[i][right]);
}
// bottom
if(top != bottom){
for(var i=right-1;i>=left;i--){
result.push(matrix[bottom][i]);
}
}
// left
if(left != right){
for(var i=bottom-1;i>top;i--){
result.push(matrix[i][left]);
}
}
top++;right--;bottom--;left++;
}
return result;
}
var arr2 = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]];
console.log(printMatrix(arr2)); // [1,2,3,4,5,10,15,19,25,24,23,22,21,16,11,6,7,8,9,14,19,18,17,12,13]