1 2 3 4  5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10

如图所示,就是一个5*5的螺旋矩阵

我的思路如下:

第一步:拆分“层”数组

把矩阵根据层数分成N个连续的自然数组,根据如果每一层宽度为n的话,那么每一层一共就有4(n-1)个数字,且当n=1时个数为1

拆分数字代码

 function splitNumbers(n,m){ /*将总数按照每一层拆分为N个数组*/

     var arr = [];

     if(n == 1){

         arr[0] = 1 + m;

     }
else{ for(var i=0;i<4*n-4;i++){ arr[i] = i + 1 + m; }
} return arr;
}

循环调用,n每次减2

  var m = 0;

     while(n > 0){

         layerArray[count] = splitNumbers(n,m);

         n = n - 2;

         m = layerArray[count][layerArray[count].length - 1];

         count++;
}

第二部:将其组装为一个“沙漏”数组

将第一步拆分好的数组取第1到n,以及2n-1到3n-2,分别组装到“沙漏”数组的两端,其中“沙漏”底部的数组需要倒序排列

部分代码

  for(var i=0;i<totalLayers;i++){/*组装成漏斗数组*/

         var index = i >= layerArray.length ? totalLayers - i - 1 : i;

         var cloneArray = layerArray[index].concat();

         if(i < totalLayers / 2){

             spiralArray[i] = cloneArray.splice(0,totalLayers - index * 2);
}
else{ spiralArray[i] = cloneArray.splice(2 * (totalLayers - 2 * i) - 2,totalLayers - index * 2); spiralArray[i] = spiralArray[i].reverse();
}
}

第三部:把“沙漏”数组填充为完整的矩阵

“沙漏”数组,第1层和倒数第n层不需要填充,从第2层开始,依次向两端填充每个“层”数组中的第n+m位以及4(n-1)-m,m位“沙漏”数组的层数

部分代码

     for(var i=0;i<spiralArray.length;i++){/*填充漏斗*/

         var index = i >= layerArray.length ? totalLayers - i - 1 : i;

         for(var j=0;j<index;j++){

             var cloneArray = layerArray[j].concat();

             spiralArray[i].splice(j,0,cloneArray[cloneArray.length - i + j]);

             spiralArray[i].splice(spiralArray[i].length - j,0,cloneArray[totalLayers - 2 * j + i - j - 1]);

         }
}

全部代码 github地址:https://github.com/yux357/my-code-kata/blob/master/spiralNumbers.js

 function splitNumbers(n,m){ /*将总数按照每一层拆分为N个数组*/

     var arr = [];

     if(n == 1){

         arr[0] = 1 + m;

     }
else{ for(var i=0;i<4*n-4;i++){ arr[i] = i + 1 + m; }
} return arr;
} function spiralNumbers(n){ var layerArray = []; var spiralArray = []; var totalLayers = n; var count = 0; var m = 0; while(n > 0){ layerArray[count] = splitNumbers(n,m); n = n - 2; m = layerArray[count][layerArray[count].length - 1]; count++;
} for(var i=0;i<totalLayers;i++){/*组装成漏斗数组*/ var index = i >= layerArray.length ? totalLayers - i - 1 : i; var cloneArray = layerArray[index].concat(); if(i < totalLayers / 2){ spiralArray[i] = cloneArray.splice(0,totalLayers - index * 2);
}
else{ spiralArray[i] = cloneArray.splice(2 * (totalLayers - 2 * i) - 2,totalLayers - index * 2); spiralArray[i] = spiralArray[i].reverse();
}
} for(var i=0;i<spiralArray.length;i++){/*填充漏斗*/ var index = i >= layerArray.length ? totalLayers - i - 1 : i; for(var j=0;j<index;j++){ var cloneArray = layerArray[j].concat(); spiralArray[i].splice(j,0,cloneArray[cloneArray.length - i + j]); spiralArray[i].splice(spiralArray[i].length - j,0,cloneArray[totalLayers - 2 * j + i - j - 1]); }
} return spiralArray;
}

Code Kata:螺旋矩阵 javascript实现的更多相关文章

  1. JavaScript螺旋矩阵

    螺旋矩阵                                                           螺旋矩阵指一个呈螺旋状的矩阵,其数字由第一行开始到右边不断变大,向下变大, ...

  2. LintCode-381.螺旋矩阵 II

    螺旋矩阵 II 给你一个数n生成一个包含1-n^2的螺旋形矩阵 样例 n = 3 矩阵为 [     [ 1, 2, 3 ],     [ 8, 9, 4 ],     [ 7, 6, 5 ] ] 标 ...

  3. LintCode-374.螺旋矩阵

    螺旋矩阵 给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素. 样例 给定如下矩阵: [     [ 1, 2, 3 ],     [ 4, 5, 6 ...

  4. LeetCode之螺旋矩阵

    问题 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ ...

  5. PAT 1050. 螺旋矩阵(25)

    本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...

  6. leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?

    Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...

  7. Java-基础编程(螺旋矩阵&乘法表)

    package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.ut ...

  8. NOIP 2014 普及组 T3 螺旋矩阵

    [题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...

  9. PAT-乙级-1050. 螺旋矩阵(25)

    1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...

随机推荐

  1. Problem L

    Problem Description 在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数. 例如n=3时,为2× 3方格,骨牌的铺放方案有三种,如下图: L&qu ...

  2. FATE

    FATE Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submissi ...

  3. jumpserver安装详解

    环境说明 主机为最小 安装的centos6.9 x86_64. [root@m01 ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [ro ...

  4. Flex 基础语法(三)

    2.flex-wrap 默认情况下,项目都排在一条线(又称"轴线")上.flex-wrap属性定义,如果一条轴线排不下,如何换行 属性 含义 nowrap(默认值) 不换行 wra ...

  5. hook in PostgreSQL初探

    HOOK IN POSTGRESQL 初探 前言 众所周知,PostgreSQL具有很好的扩展性,是一个可以"开发"的数据库.在PostgreSQL里面,你可以定制你自己的Type ...

  6. 使用GetThumbnailImage进行图片缩放操作

    /// <summary>        /// 获取等比例缩放图片的方法        /// </summary>        /// <param name=&q ...

  7. Dubbo源码学习--环境搭建及基础准备(ServiceLoader、ExtensionLoader)

    环境搭建 Github上下载Dubbo最新发布版本,楼主下载版本为2.5.7. cd到源码解压目录,maven编译,命令为: mvn clean install -Dmaven.test.skip 生 ...

  8. 通过Xshell连接CentOS虚拟机

    1.通过"setup"配置网络ip(CentOS7不支持setup配置) 2.通过"service network restart"来重启网络服务 3.&quo ...

  9. [转载] ZooKeeper原理及使用

    转载自http://www.wuzesheng.com/?p=2609 ZooKeeper是Hadoop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调(Coordina ...

  10. 判断pdf、word文档、图片等文件类型(格式)、大小的简便方法

    判断pdf.word文档.图片等文件类型(格式).大小的简便方法 很久没发文了,今天有时间就写一下吧. 关于上传文件,通常我们都需要对其进行判断,限制上传的类型,如果是上传图片,我们甚至会把图片转化成 ...