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

如图所示,就是一个5*5的螺旋矩阵

我的思路如下:

第一步:拆分“层”数组

把矩阵根据层数分成N个连续的自然数组,根据如果每一层宽度为n的话,那么每一层一共就有4(n-1)个数字,且当n=1时个数为1

Code Kata:螺旋矩阵  javascript实现

拆分数字代码

 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,分别组装到“沙漏”数组的两端,其中“沙漏”底部的数组需要倒序排列

Code Kata:螺旋矩阵  javascript实现

部分代码

  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位“沙漏”数组的层数

Code Kata:螺旋矩阵  javascript实现

部分代码

     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;
}
上一篇:ios 百度地图api 入门


下一篇:Windows组件:打开MSDTC,恢复Windows TaskBar,查看windows日志,打开Remote Desktop,打开Services,资源监控