螺旋矩阵
m 行 n 列的矩阵,按照顺时针螺旋顺序,返回矩阵中的所有元素。
例如:
| 1 | 2 | 3 |
|---|---|---|
| 4 | 5 | 6 |
| 7 | 8 | 9 |
这样一个表格输出如下数组 [1,2,3,6,9,8,7,4,5]
- 思路
- 按照右、下、左、上顺序分别取出对应的元素,插入到一个新的数组,并且删除原数据中的取出的数据
- 注意每一行只有一个元素的数据
let spiralOrder = (arr = [], arrSave = []) => {
// 暂存数据
const targetArr = arrSave
// 深拷贝一份传入的数据
const copyArr = JSON.parse(JSON.stringify(arr))
// 存放向上的数据
const toTopArr = []
for (let i = 0; i < arr.length; i++) {
if (i === 0) {
// 第一行 插入向右的数据
targetArr.push(...arr[0])
// 删除第一行
copyArr.shift()
} else if (i > 0 && i < arr.length - 1) {
// 除了第一行和最后一行的中间行数,在这里获取向下和向上的数据
// 如果当前数据没有值,则跳出当前循环
if(!arr[i][arr[i].length - 1]) {
continue
}
// 获取当前行,最后一位的数据,并插入
targetArr.push(arr[i][arr[i].length - 1])
// 删除上一步获取的数据
copyArr[i - 1].splice(arr[i].length - 1, 1)
// 如果当前行的数据长度大于 1
if (arr[i].length > 1) {
// 暂存向上的数据
toTopArr.push(arr[i][0])
// 删除上一步获取的数据
copyArr[i - 1].splice(0, 1)
}
} else {
// 插入向左的数据
targetArr.push(...arr[arr.length - 1].reverse())
// 最后插入向上的数据
targetArr.push(...toTopArr.reverse())
// 删除最后一行
copyArr.pop()
}
}
if (copyArr.length > 0) {
spiralOrder(copyArr, targetArr)
}
return targetArr
}