螺旋矩阵

132 阅读1分钟

螺旋矩阵

m 行 n 列的矩阵,按照顺时针螺旋顺序,返回矩阵中的所有元素。
例如:

123
456
789

这样一个表格输出如下数组 [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
}