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 }

View Code

 

版权声明:本文为jinyuGu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:http://www.cnblogs.com/jinyuGu/p/8060318.html