Js 实现螺旋,逆螺旋矩阵

题目

制定一个函数,通过传输一个值,生成如下所示的效果。

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、如图所示,矩阵是由一个 1~25 的数字生成,实际上即 1~nn 的数字组成。即一维数组[1, 2, 3, ..., nn]。

-> 注:n 为函数输入的值

2、根据算法,将值一一放入二维数组中相应的位置。组成如

[[1,2,3],
 [8,9,4],
 [7,6,5]]

-> 思考: 算法的核心即在此,如何正确无误的把一维数组转为二维数组。

方式 1:按 1,2,3, 8,9,4, 7,6,5 这样放?思考发现其值很难找到规律。

方式 2: 按其螺旋规律,将 1,2,3,4,5,6,7,8,9 依次放入对应的位置。

代码如下:

function transformation(n) {
    // 1、初始化对应的二维数组
    const result = [...new Array(n)].map(() => [])
    // 2、初始化行列,以及判断条件
    let max = n - 1,
        min = 0,
        row = 0,
        col = 0;
    for (let i = 1, length = n * n; i <= length; i++) {
        result[row][col] = i
        switch (true) {
            case row === min && col < max:
                ++col;
                break;
            case col === max && row < max:
                ++row;
                break;
            case row === max && col > min:
                --col;
                break;
            case col === min && row > min:
                --row;
                break;
        }
        // 走完一圈,缩小范围
        if (row - 1 === min && col === min) {
            ++min;
            --max;
        }
    }
    return result; 
}

const resultArr = transformation(5)

举一反三

逆螺旋的矩阵如何生成?

代码如下:

function transformation(n) {
    // 1、初始化对应的二维数组
    const result = [...new Array(n)].map(() => [])
    // 2、初始化行列,以及判断条件
    let max = n - 1,
        min = 0,
        row = 0,
        col = 0;
    for (let i = 1, length = n * n; i <= length; i++) {
        result[row][col] = i
        switch (true) {
            case col === min && row < max:
                ++row;
                break;
            case row === max && col < max:
                ++col;
                break;
            case col === max && row > min:
                --row;
                break;
            case row === min && col > min:
                --col;
                break;
        }
        // 走完一圈,缩小范围
        if (col - 1 === min && row === min) {
            ++min;
            --max;
        }
    }
    return result; 
}

transformation(5)

posted @ 2021-05-17 21:25  志在指尖  阅读(314)  评论(0编辑  收藏  举报