剑指OFFER----29、顺时针打印矩阵(js实现)

题目

  • 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:

    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16

  • 则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。

  • leetcode链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/


// 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

// 示例 1:
// 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
// 输出:[1,2,3,6,9,8,7,4,5]

// 示例 2:
// 输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
// 输出:[1,2,3,4,8,12,11,10,9,5,6,7]

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function (matrix) {
  if (!matrix.length || !matrix[0].length) return []
  const result = []
  const rowCounts = matrix.length
  const columnCounts = matrix[0].length
  let startRowIndex = 0
  let startColumnIndex = 0
  let endRowIndex = rowCounts - 1
  let endColumnIndex = columnCounts - 1
  while (startRowIndex < endRowIndex && startColumnIndex < endColumnIndex) {
    // 上
    for (let i = startColumnIndex; i < endColumnIndex; i++) {
      result.push(matrix[startRowIndex][i])
    }
    // 右
    for (let i = startRowIndex; i < endRowIndex; i++) {
      result.push(matrix[i][endColumnIndex])
    }
    // 下
    for (let i = endColumnIndex; i > startColumnIndex; i--) {
      result.push(matrix[endRowIndex][i])
    }
    // 左
    for (let i = endRowIndex; i > startRowIndex; i--) {
      result.push(matrix[i][startColumnIndex])
    }
    startRowIndex++
    startColumnIndex++
    endRowIndex--
    endColumnIndex--
  }
  if (startColumnIndex === endColumnIndex && startRowIndex < endRowIndex) {
    for (let i = startRowIndex; i <= endRowIndex; i++) {
      result.push(matrix[i][startColumnIndex])
    }
  } else if (startRowIndex === endRowIndex && startColumnIndex < endColumnIndex) {
    for (let i = startColumnIndex; i <= endColumnIndex; i++) {
      result.push(matrix[startRowIndex][i])
    }
  } else if (startRowIndex === endRowIndex && startColumnIndex === endColumnIndex) {
    result.push(matrix[startRowIndex][startColumnIndex])
  }
  return result
}

console.log(spiralOrder([[6,9,7]]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值