顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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 helper(matrix *[][]int, result *[]int, start, row, col int) { curRow := row - start - 1 curCol := col - start - 1 // 打印第一行 for i := start; i <= curCol; i++ { *result = append(*result, (*matrix)[start][i]) } // 打印最后一列 if curRow > start { for i := start + 1; i <= curRow; i++ { *result = append(*result, (*matrix)[i][curCol]) } } // 打印最后一行 if curRow > start && curCol > start { for i := curCol - 1; i >= start; i-- { *result = append(*result, (*matrix)[curRow][i]) } } //打印第一列 if curRow > start + 1 && curCol > start { for i := curRow - 1; i > start; i-- { *result = append(*result, (*matrix)[i][start]) } } } func printMatrix( matrix [][]int ) []int { // write code here if len(matrix) == 0 { return []int{} } if len(matrix[0]) == 0 { return []int{} } var result []int start := 0 row := len(matrix) col := len(matrix[0]) for row > 2 * start && col > 2 * start { helper(&matrix, &result, start, row, col) start++ } return result }