欣迪

出處: https://leetcode.com/problems/spiral-matrix/

Given an m x n matrix, return all elements of the matrix in spiral order.

Example 1:

Input: matrix = [[1,2,3],[4,5,6],[7,8,9]]
Output: [1,2,3,6,9,8,7,4,5]

Example 2:

Input: matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]

Constraints:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

/**
 * @param {number[][]} matrix
 * @return {number[]}
 */
var spiralOrder = function(matrix) {
    // 如果是一排的情形,直接壓扁送回
    if (matrix[0].length === 1) {
        return matrix.flat()
    }
  	// 記錄結果的陣列
  	const output = []
  	// 開始迴圈,直到所有數字用完
    while(matrix.length && matrix[0].length) {
      	// 第一排先整排加入
        output.push(...matrix[0])
      	// 把已經加入的第一排刪除
        matrix.shift()
		// 如果刪除後已經沒有任何數字,中斷迴圈
        if (!matrix.length) break
      	// 直的加入每一列的最後一個數字
        for (let j = 0; j < matrix.length; j++) {
            output.push(matrix[j].pop())
        }
      	// 把最後一行返轉,加入結果並從陣列中刪除
        const lastRow = matrix.pop()
        output.push(...lastRow.reverse())
      	// 如果刪除後已經沒有數字,或是最後一行本來就是空的,中斷迴圈
        if (!matrix.length || !lastRow.length) break
      	// 最後倒著往上加入每一列的第一個數字
        for (let k = matrix.length - 1; k >= 0 ; k--) {
            output.push(matrix[k].shift())
        }
    }
    return output
};

訂閱 IT-Monk

訂閱最新文章的發布消息! 😚😚😚
Loading

作者介紹 - 欣迪

欣迪

從設計到寫程式,發現自己有追求前端技巧的自虐傾向。不斷的踩坑,再從坑裡爬出來,慢慢對攀岩有點心得。 目前在多間公司擔任網站設計顧問。 同時也是網站架設公司負責人。