利用JavaScript实现蛇形矩阵

利用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]

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值