funcspiralOrder(matrix [][]int) []int {
var res []intforlen(matrix) > 0 {
var i, j int move := right
for move !=0 {
res = append(res, matrix[i][j])
move = next(matrix, i, j, move)
switch move {
case right:
j++case down:
i++case left:
j--case up:
i-- }
}
matrix = rebuild(matrix)
}
return res
}
const (
right = 1 down = 2 left = 3 up = 4)
// 判断下一步往哪儿走
funcnext(matrix [][]int, i, j int, move int) int {
m :=len(matrix)
if m ==0 {
return0 }
n :=len(matrix[0])
switch move {
case right:
if j == n-1 {
// 如果下一步无法往下走,终止
if i == m-1 {
return0 }
return down
}
case down:
if i == m-1 {
// 如果下一步无法往左走,终止
if j ==0 {
return0 }
return left
}
case left:
if j ==0 {
// 如果下一步无法往上走,终止。这里注意,是1不是0,因为0是起点
if i ==1 {
return0 }
return up
}
case up: // 走完上就结束了
if i ==1 {
return0 }
}
return move
}
// 矩阵去壳
funcrebuild(matrix [][]int) [][]int {
iflen(matrix) ==0 {
returnnil }
iflen(matrix) <=2||len(matrix[0]) <=2 {
returnnil }
var res [][]intfor i :=1; i < len(matrix)-1; i++ {
res = append(res, matrix[i][1:len(matrix[i])-1])
}
return res
}