JZ19 顺时针打印矩阵

顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
 
思路:第一个循环判断是否还能打印一圈,开始点坐标(start,start),然后打印一圈;
打印第一行:无需判断;
打印最后一列:结束行大于开始行;
打印最后一行:结束行大于开始行,结束列大于开始列;
打印第一列:结束行大于(开始行+1),结束列大于开始列。
 
(start,start) (start,endCol)
(endRow,start) (endRow,endCol)
 
注意细节:打印函数里面不要计算列数和行数,需要得到的是最后的下标,还有就是圈数循环继续的条件是列数大于start*2,行数大于start*2;
 
func printMatrix( matrix [][]int ) []int {
	if len(matrix) == 0 || len(matrix[0]) == 0 {
		return nil
	}

	rows, cols := len(matrix), len(matrix[0])
	result := make([]int, 0, rows*cols)

	top, bottom := 0, rows-1
	left, right := 0, cols-1

	for top <= bottom && left <= right {
		// 从左到右
		for i := left; i <= right; i++ {
			result = append(result, matrix[top][i])
		}
		top++

		// 从上到下
		for i := top; i <= bottom; i++ {
			result = append(result, matrix[i][right])
		}
		right--

		// 从右到左
		if top <= bottom {
			for i := right; i >= left; i-- {
				result = append(result, matrix[bottom][i])
			}
			bottom--
		}

		// 从下到上
		if left <= right {
			for i := bottom; i >= top; i-- {
				result = append(result, matrix[i][left])
			}
			left++
		}
	}

	return result
}

  

posted @ 2021-04-08 21:17  zqlucky  阅读(108)  评论(0编辑  收藏  举报