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 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
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章