回形遍历问题

问:编写
SpreadOutArrs函数
1 | console.log(SpreadOutArrs([ |
答:找规律
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
思路:回形遍历,首先要找到回形路线的规则,通过有序的回形递增数值展开找规律,展开后为
0,1,2,3,4,9,14,19,24,23,22,21,20,15,10,5,6,7,8,13,18,17,16,11,12
好下面开始找规律,如图:

关键点说明:
n: n是指回形的宽高
l:l是个关键,每一段(环)以l2分,按下标相加得出一个固定值(n² - 1),【如果是从1开始的则是n²,不过js下标习惯从0开始】;
n-2: n-2是每一环n的递减规律
解:
1、从图中可以看出,每一段的规律是一样的,只是段长度和起始值不同,可以看出,段长度是以n - 2 的规律递减的,因此,可以以一个递归实现:
1 | function order (n) { |
2、怎样得出l,每一环的数量为:
1 | n² - (n - 2)² |
3、根据每一段的规律计算下标
1 | // l 在上文求出 |
以上实现了一段,也就是一个回环的顺时针下标排列,下面将其套入到回环递归中,注意:n的值是在递减,要把n的初始值保存。如下:
1 | function order (n) { |
如上:其中值得一提的是 r 变量的规律,r = 环下标 回形原始宽加1,即 r = rI (initLen + 1),
至此,我们已经得出了回形遍历的函数方法,可以应用到此类案例中,本文题目就是一个这样的案例,如下解:
1 | function SpreadOutArrs (arr) { |