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
拆分数字代码
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