算法题-螺旋数组

题目:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
foo(1) = [[1]];
foo(2) = [ [1,2]
[4,3] ];
foo(3) = [ [7,8,9]
[6,1,2]
[5,4,3] ];
foo(4) = [ [7, 8, 9, 10]
[6, 1, 2, 11]
[5, 4, 3, 12]
[16,15,14,13] ];
foo(5) = [ [21,22,23,24,25]
[20, 7, 8, 9,10]
[19, 6, 1, 2,11]
[18, 5, 4, 3,12]
[17,16,15,14,13] ];

思路:
算法题-螺旋数组-思路

从图中foo(5)上的几个方框可以看出,foo(5)可以拆成五个部分,这五个部分代表了从foo(1)foo(5)foo(n)n每大1,外面就多一层,单数加在左上,双数加在右下。

因此我们把答案(下面的解法)分为两部分,一个函数是用来循环boo(1)(实际上是boo(2))到boo(n),另一个函数用来添加实际的数组项。

解法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function foo(n) {
let arr = [[1]]
if (n > 1) {
// n > 1
for(let k = 2; k <= n; k++) {
arr = boo(arr, k)
}
return arr
} else {
return arr
}
}

function boo(array, n) {
if (n % 2 === 0) {
// 双数
let arr1 = []
for (let i = n ** 2;i >= n ** 2 - n + 1; i --) {
arr1.push(i)
}
array.push(arr1)
for (let j = 0; j < n - 1; j ++) {
array[j].push(n ** 2 + j - 2 * n + 2)
}
return array
} else {
// 单数
let arr1 = []
for (let i = n ** 2 - n + 1;i <= n ** 2; i++) {
arr1.push(i)
}
array.unshift(arr1)
for (let j = 1; j < n; j++) {
array[j].unshift(n ** 2 - n - j + 1)
}
return array
}
}

console.log(foo(4))
// 0: (4) [7, 8, 9, 10]
// 1: (4) [6, 1, 2, 11]
// 2: (4) [5, 4, 3, 12]
// 3: (4) [16, 15, 14, 13]


(END)