题目
制定一个函数,通过传输一个值,生成如下所示的效果。
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
思路:
该效果是一个矩阵,本思路是生成一个二维数组来达成该效果。
1、如图所示,矩阵是由一个 1~25 的数字生成,实际上即 1~nn 的数字组成。即一维数组[1, 2, 3, ..., nn]。
-> 注:n 为函数输入的值
2、根据算法,将值一一放入二维数组中相应的位置。组成如
[[1,2,3],
[8,9,4],
[7,6,5]]
-> 思考: 算法的核心即在此,如何正确无误的把一维数组转为二维数组。
方式 1:按 1,2,3, 8,9,4, 7,6,5 这样放?思考发现其值很难找到规律。
方式 2: 按其螺旋规律,将 1,2,3,4,5,6,7,8,9 依次放入对应的位置。
代码如下:
function transformation(n) {
// 1、初始化对应的二维数组
const result = [...new Array(n)].map(() => [])
// 2、初始化行列,以及判断条件
let max = n - 1,
min = 0,
row = 0,
col = 0;
for (let i = 1, length = n * n; i <= length; i++) {
result[row][col] = i
switch (true) {
case row === min && col < max:
++col;
break;
case col === max && row < max:
++row;
break;
case row === max && col > min:
--col;
break;
case col === min && row > min:
--row;
break;
}
// 走完一圈,缩小范围
if (row - 1 === min && col === min) {
++min;
--max;
}
}
return result;
}
const resultArr = transformation(5)
举一反三
逆螺旋的矩阵如何生成?
代码如下:
function transformation(n) {
// 1、初始化对应的二维数组
const result = [...new Array(n)].map(() => [])
// 2、初始化行列,以及判断条件
let max = n - 1,
min = 0,
row = 0,
col = 0;
for (let i = 1, length = n * n; i <= length; i++) {
result[row][col] = i
switch (true) {
case col === min && row < max:
++row;
break;
case row === max && col < max:
++col;
break;
case col === max && row > min:
--row;
break;
case row === min && col > min:
--col;
break;
}
// 走完一圈,缩小范围
if (col - 1 === min && row === min) {
++min;
--max;
}
}
return result;
}
transformation(5)