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

拆分数字代码

  1. function splitNumbers(n,m){ /*将总数按照每一层拆分为N个数组*/
  2.  
  3. var arr = [];
  4.  
  5. if(n == 1){
  6.  
  7. arr[0] = 1 + m;
  8.  
  9. }
  10. else{
  11.  
  12. for(var i=0;i<4*n-4;i++){
  13.  
  14. arr[i] = i + 1 + m;
  15.  
  16. }
  17. }
  18.  
  19. return arr;
  20. }

循环调用,n每次减2

  1. var m = 0;
  2.  
  3. while(n > 0){
  4.  
  5. layerArray[count] = splitNumbers(n,m);
  6.  
  7. n = n - 2;
  8.  
  9. m = layerArray[count][layerArray[count].length - 1];
  10.  
  11. count++;
  12. }

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

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

部分代码

  1. for(var i=0;i<totalLayers;i++){/*组装成漏斗数组*/
  2.  
  3. var index = i >= layerArray.length ? totalLayers - i - 1 : i;
  4.  
  5. var cloneArray = layerArray[index].concat();
  6.  
  7. if(i < totalLayers / 2){
  8.  
  9. spiralArray[i] = cloneArray.splice(0,totalLayers - index * 2);
  10. }
  11. else{
  12.  
  13. spiralArray[i] = cloneArray.splice(2 * (totalLayers - 2 * i) - 2,totalLayers - index * 2);
  14.  
  15. spiralArray[i] = spiralArray[i].reverse();
  16. }
  17. }

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

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

部分代码

  1. for(var i=0;i<spiralArray.length;i++){/*填充漏斗*/
  2.  
  3. var index = i >= layerArray.length ? totalLayers - i - 1 : i;
  4.  
  5. for(var j=0;j<index;j++){
  6.  
  7. var cloneArray = layerArray[j].concat();
  8.  
  9. spiralArray[i].splice(j,0,cloneArray[cloneArray.length - i + j]);
  10.  
  11. spiralArray[i].splice(spiralArray[i].length - j,0,cloneArray[totalLayers - 2 * j + i - j - 1]);
  12.  
  13. }
  14. }

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

  1. function splitNumbers(n,m){ /*将总数按照每一层拆分为N个数组*/
  2.  
  3. var arr = [];
  4.  
  5. if(n == 1){
  6.  
  7. arr[0] = 1 + m;
  8.  
  9. }
  10. else{
  11.  
  12. for(var i=0;i<4*n-4;i++){
  13.  
  14. arr[i] = i + 1 + m;
  15.  
  16. }
  17. }
  18.  
  19. return arr;
  20. }
  21.  
  22. function spiralNumbers(n){
  23.  
  24. var layerArray = [];
  25.  
  26. var spiralArray = [];
  27.  
  28. var totalLayers = n;
  29.  
  30. var count = 0;
  31.  
  32. var m = 0;
  33.  
  34. while(n > 0){
  35.  
  36. layerArray[count] = splitNumbers(n,m);
  37.  
  38. n = n - 2;
  39.  
  40. m = layerArray[count][layerArray[count].length - 1];
  41.  
  42. count++;
  43. }
  44.  
  45. for(var i=0;i<totalLayers;i++){/*组装成漏斗数组*/
  46.  
  47. var index = i >= layerArray.length ? totalLayers - i - 1 : i;
  48.  
  49. var cloneArray = layerArray[index].concat();
  50.  
  51. if(i < totalLayers / 2){
  52.  
  53. spiralArray[i] = cloneArray.splice(0,totalLayers - index * 2);
  54. }
  55. else{
  56.  
  57. spiralArray[i] = cloneArray.splice(2 * (totalLayers - 2 * i) - 2,totalLayers - index * 2);
  58.  
  59. spiralArray[i] = spiralArray[i].reverse();
  60. }
  61. }
  62.  
  63. for(var i=0;i<spiralArray.length;i++){/*填充漏斗*/
  64.  
  65. var index = i >= layerArray.length ? totalLayers - i - 1 : i;
  66.  
  67. for(var j=0;j<index;j++){
  68.  
  69. var cloneArray = layerArray[j].concat();
  70.  
  71. spiralArray[i].splice(j,0,cloneArray[cloneArray.length - i + j]);
  72.  
  73. spiralArray[i].splice(spiralArray[i].length - j,0,cloneArray[totalLayers - 2 * j + i - j - 1]);
  74.  
  75. }
  76. }
  77.  
  78. return spiralArray;
  79. }

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. 助你了解react的小demo

    React是个啥 React 是一个用于构建用户界面的 JAVASCRIPT 库. React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图). React 起源于 Facebo ...

  2. 网络拓展知识 ACL NAT IPv6

    第1章 ACL 访问控制列表 访问控制表(”位代表精确匹配,而“1“位代表不许匹配. 例如路由器EIGRP的配置中: RouterA(config)#router eigrp 100 RouterA( ...

  3. 桌面消息通知:HTML5 Notification

    先上一段完整代码 //注册权限 Notification.requestPermission(function (status) { // 这将使我们能在 Chrome/Safari 中使用 Noti ...

  4. AJAX 笔记

    一.什么是 AJAX ? AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种用于创建快速动态网页的技术. 通过 ...

  5. T-SQL 删除重复数据SQL

    WITH cte AS (   SELECT roleid,permissionid,      row_number() OVER(PARTITION BY roleid,permissionid ...

  6. Scrum Meeting Alpha - 4

    Scrum Meeting - NewTeam // 地点:新主楼F座二楼 任务反馈 团队成员 完成任务 计划任务 安万贺 确定了API部分的目录结构及包装方式,完成了部分API的包装https:// ...

  7. Jenkins Kubernetes Slave 调度效率优化小记

    Jenkins K8S Slave 调度效率优化 by yue994488@126.com 使用kubernetes为测试工具Gatling进行大规模压测,压测期间发现Jenkins调度压测实例较慢, ...

  8. oracle数据库表实现主键自增功能

    有关oracle中自增序列sequence+触发器trigger:实现数据表TABDATA_LIVE_CYCLE中的主键id的自增. CREATE SEQUENCE TABDATA_LIVE_CYCL ...

  9. Postman+newman+jenkins构建

      最近忙着项目接口测试,经过不同工具的对比,发现postman使用起来挺顺手的,所以马上决定使用这个工具进行接口测试工作.刚开始的时候,了解了下接口测试的相关信息,直接着手编写接口测试的测试用例信息 ...

  10. NuGet的使用、部署、搭建私有服务

    NuGet的使用.部署.搭建私有服务 前言 什么是NuGet? 为什么要使用NuGet NuGet的优点 使用 Get-Help NuGet Install-Package Get-Package U ...