Code Kata:螺旋矩阵 javascript实现
| 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 |
如图所示,就是一个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实现的更多相关文章
- JavaScript螺旋矩阵
螺旋矩阵 螺旋矩阵指一个呈螺旋状的矩阵,其数字由第一行开始到右边不断变大,向下变大, ...
- LintCode-381.螺旋矩阵 II
螺旋矩阵 II 给你一个数n生成一个包含1-n^2的螺旋形矩阵 样例 n = 3 矩阵为 [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 标 ...
- LintCode-374.螺旋矩阵
螺旋矩阵 给定一个包含 m x n 个要素的矩阵,(m 行, n 列),按照螺旋顺序,返回该矩阵中的所有要素. 样例 给定如下矩阵: [ [ 1, 2, 3 ], [ 4, 5, 6 ...
- LeetCode之螺旋矩阵
问题 螺旋矩阵 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ ...
- PAT 1050. 螺旋矩阵(25)
本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条 ...
- leetcode-Spiral Matrix II 螺旋矩阵2之python大法好,四行就搞定,你敢信?
Spiral Matrix II 螺旋矩阵 Given an integer n, generate a square matrix filled with elements from 1 to n2 ...
- Java-基础编程(螺旋矩阵&乘法表)
package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.ut ...
- NOIP 2014 普及组 T3 螺旋矩阵
[题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...
- PAT-乙级-1050. 螺旋矩阵(25)
1050. 螺旋矩阵(25) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求将给定的N个正整数按非递增的 ...
随机推荐
- hdu 3001 Travelling(状态压缩 三进制)
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 1892 See you~(二维树状数组)
See you~ Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Su ...
- 使用javascript编写根据用户鼠标控制背景图片的移动
在一家VR公司做前端. 起初进入前端就是一种内心的直觉,创造更好的用户体验,让页面更加友好,当然最起初接手web项目还是为了完成毕业设计. 一个网上图书商城,虽然不大,但五脏都有毕竟开刀所以避免不了很 ...
- Icon font font face
font-face自定义字体,iconfont就是把各种图片做成字体.iconfont优势: 字体文件小,一般20-50kb: 容易编辑和维护,尺寸和颜色可以用css来控制: 透明完全兼容IE6: ...
- 数据库Oracle
一. 表空间和数据文件的关系: 文件组成:数据文件,控制文件,数据库日志文件 数据文件:.dbf 包含全部数据库数据(表,索引等),一个数据文件仅与一个数据库关联.一旦建立,只增不减. 表空间(Tab ...
- 发放福利:原价135元/年的阿里云CDN流量包(500GB)免费送
不少朋友看过本站推荐的两篇文章:1. <阿里云全民云计算活动:云服务器ECS二折起>2. <阿里云双11优惠活动-爆款云服务器> 大部分人都说不错,很快下单购买了服务器,后续使 ...
- 浅析Struts2中的OGNL和ValueStack
要了解Struts2与OGNL表达式的关系,我们必须先搞清楚以下三个概念: 1. ActionContext它是Action运行的上下文环境,Action的多项设置都存放在次,我们每一次Action ...
- c#params应用
params 是C#开发语言中关键字, params主要的用处是在给函数传参数的时候用,就是当函数的参数不固定的时候. 在方法声明中的 params 关键字之后不允许任何其他参数,并且在方法声明中只允 ...
- C# 扩展方法使用
为指定类型扩展方法: 定义类Class1: public static class Class1 //必须为static类,且不能包含 ...
- Python 直接赋值、浅拷贝和深度拷贝全解析
直接赋值:其实就是对象的引用(别名,其实就是一个人今天叫张三 明天叫张狗子的意思).这个人比较自由单身狗嘛 可以恋爱可以分手 就是一个小屌丝. 浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的 ...