当前位置: 首页 > news >正文

Code Kata:螺旋矩阵 javascript实现

1234 5
161718196
152425207
142322218
13121110

如图所示,就是一个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 }
View Code

 

转载于:https://www.cnblogs.com/jinyuGu/p/8060318.html

相关文章:

  • C++容器与算法
  • PostgreSQL在何处处理 sql查询之四十三
  • Tomcat建立多个应用(Web Server),多个主机,多个站点的方法
  • org.tmatesoft.svn.core.SVNCancelException: svn: E200015: authentication canc
  • Linux下查看Tomcat的控制台输出信息
  • 每天一句话
  • Android基础 使用ToolBar教你打造一个通用的标题栏
  • 单点登录配置问题
  • Mac 10.11 React Native 安装记录
  • 字符串编辑距离(转载)
  • 2.10-2.13环境变量、CP、MV、文档查看
  • Civil 3D 2013新功能及新API Webcast下载
  • wpf treeview 数据绑定 递归绑定节点
  • xml文件的解析
  • webpack开发jquery插件——开发环境准备
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 07.Android之多媒体问题
  • canvas 绘制双线技巧
  • Fundebug计费标准解释:事件数是如何定义的?
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • nfs客户端进程变D,延伸linux的lock
  • node入门
  • 创建一种深思熟虑的文化
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 计算机在识别图像时“看到”了什么?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 判断客户端类型,Android,iOS,PC
  • 微服务入门【系列视频课程】
  • (八十八)VFL语言初步 - 实现布局
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (小白学Java)Java简介和基本配置
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转载)从 Java 代码到 Java 堆
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Framework与.NET Framework SDK有什么不同?
  • .net mvc 获取url中controller和action
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • ?php echo ?,?php echo Hello world!;?
  • [1]-基于图搜索的路径规划基础
  • [Angular] 笔记 6:ngStyle
  • [AX]AX2012 SSRS报表Drill through action
  • [C++]二叉搜索树
  • [CTO札记]如何测试用户接受度?
  • [DM复习]Apriori算法-国会投票记录关联规则挖掘(上)
  • [Interview]Java 面试宝典系列之 Java 多线程
  • [javaSE] 数据结构(二叉查找树-插入节点)
  • [linux] GFLOPS和TFLOPS的换算
  • [Linux] 进程间通信基础