劍指offer 面試題20 順時針列印矩陣

2021-07-02 03:39:47 字數 1928 閱讀 9952

題目:

輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。

例如:如果輸入如下矩陣:

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。

基本思想:

通常當我們遇到乙個複雜的問題的時候,我們可以用圖形幫助我們思考。由於我們是以從外圈到內圈的順序依次列印,我們在矩陣中標註一圈作為我們分析的目標。在下圖中,我們設矩陣的寬度為columns,而其高度為rows。我們我們選取左上角座標為(startx, starty),右下角座標為(endx, endy)的乙個圈來分析。

由於endx和endy可以根據startx、starty以及columns、rows來求得,因此此時我們只需要引入startx和starty兩個變數。我們可以想象有乙個迴圈,在每一次迴圈裡我們從(startx, starty)出發按照順時針列印數字。

接著我們分析這個迴圈結束的條件。對乙個5×5的矩陣而言,最後一圈只有乙個數字,對應的座標為(2, 2)。我們發現5 > 2 * 2。對乙個6×6的矩陣而言,最後一圈有四個數字,對應的座標仍然為(2, 2)。我們發現6 > 2 * 2依然成立。於是我們可以得出,讓迴圈繼續的條件是columns > startx * 2 && rows > starty * 2。

接下來我們分析如何按照順時針的順序列印一圈的數字。如同在圖中標註的那樣,我們可以分四步來列印:第一步是從左到右列印一行(上圖中黃色區域),第二步是從上到下列印一列(上圖中綠色區域),第三步從右到左列印一行(上圖中藍色區域),最後一步是從下到上列印一列(上圖中紫色區域)。也就是我們把列印一圈數字這個問題,分解成四個子問題。

值得注意的是,最後一圈可能退化成只有一行、只有一列、甚至只有乙個數字,因此列印這樣的一圈就不需要四步了。

//從上到下列印一列

if (nendy > nstart)

} //從右到左列印一行

if (nendy > nstart && nendx > nstart)

} //從下到上列印一列

if (nendy -1 > nstart && nendx > nstart)

}

} //順時針列印矩陣,行數為rows,列數為columns

劍指Offer 面試題29 順時針列印矩陣

面試題29 順時針列印矩陣 題目 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。從上到下列印一列 if start 從右到左列印一行 if start 從下到上列印一列 if start void printmatrixclockwisely int numbers,int colu...

劍指offer 面試題29 順時針列印矩陣

輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。示例 1 輸入 matrix 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 示例 2 輸入 matrix 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1,2,3,4,8,12,11,10,9...

劍指offer 面試題29 順時針列印矩陣

面試題29.順時針列印矩陣 輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。示例 1 輸入 matrix 1,2,3 4,5,6 7,8,9 輸出 1,2,3,6,9,8,7,4,5 示例 2 輸入 matrix 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1,2,3,...