zoukankan      html  css  js  c++  java
  • 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)
    
    
    以梦为马
  • 相关阅读:
    jvm 指令 invokedynamic
    go switch
    JVM指令 bytecode invokespecial
    babel插件开发
    go 循环依赖 循环引用 最佳实践
    go module 使用入门
    搞懂gopath golang go go项目结构
    SQL Server 工具
    SQLServer Management Studio登录框中的“服务器名”填写
    win2008下安装SQL SERVER 2005出现IIS功能要求 警告解决方案
  • 原文地址:https://www.cnblogs.com/lsAxy/p/14778654.html
Copyright © 2011-2022 走看看