資料結構與演算法 順時針 迴圈列印 矩陣

2021-09-12 14:13:25 字數 1088 閱讀 9888

順時針迴圈列印乙個矩陣元素。

想法一:如何控制下一步?下一步是由當前方向決定的。所以最直觀的想法就是維護乙個方向變數,然後建立乙個偏移量的二維陣列,第一維傳入的方向,大小為4,第二維是x和y方向的前進量,大小為2。然後我們就根據方向來獲取下一步移動的偏移量,如果碰壁,就修改方向,方向的修改是乙個從大小為4的迴圈陣列中輪流取值的過程。這個思路是可行的。當然還需要判定停止條件,可以用乙個輔助陣列記錄哪些遍歷過,如果遍歷到乙個已經遍歷過的元素,就跳出,這是一種思路。

想法二:

想法一是可行的,但是其實可以省去方向變數和標記的過程,思考的模式變一下。

每一次x和y變化的座標只有乙個,所以我們只需要乙個遍歷指標(其實是變數);

整個過程可以看成是多輪遍歷,每一輪包括四個方向,繞一圈;

也就是抽象為:

while()

每乙個內部的for,都會限定遍歷的範圍,遍歷完就更新邊界值。還要想好跳出的條件,就是遍歷完一行或者一列,導致下一次沒有空餘的行或者列遍歷了,也就是for之前判定一下行號或者列號的最大值是否小於最小值,如果是就break。那是不是每乙個for迴圈都要判定?都判定肯定沒問題,如果想要精簡**,只需要判定乙個列的遍歷和乙個行的遍歷即可。因為總會走到這個判定裡。並且每乙個for迴圈內部也不會受影響,因為for內部有條件限制。

public static void rotate(int array) 

//遍歷完修改行的最小邊界

l ++;

//遍歷右側的列

for (i = l; i <= m; i++)

//遍歷完修改列的右邊界

n --;

//檢測行是否遍歷完了,如果碰上了,說明該退出

if (l > m)

//遍歷下面的行

for (i = n; i >= k; i--)

//遍歷完修改行的最大邊界

m--;

//檢測列是否遍歷完了,如果碰上了,說明該退出

if (k > n)

//遍歷左側的列

for (i = m; i >= l; i--)

//遍歷完修改列的左邊界

k++;

}}

資料結構(順時針列印矩陣)

很早就看到這道題了,但是我是乙個患有拖延癌的人。有個朋友經常開玩笑,總有一天你會錯過你的婚禮。今天上午去自習室認真思考了乙個小時,認真把邏輯理順了。在草稿紙上把基本 寫了一道,回來驗證成功了,開心。首先,列印矩陣,分圈數列印,判斷需要列印幾圈。由於矩陣的對稱性,矩陣是用乙個二維陣列儲存的。所以矩陣的...

演算法 面試 順時針列印矩陣

輸入乙個矩陣,按照從外向裡以順時針的順序依次列印出每乙個數字。示例 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...

leecode面試題29 順時針旋轉列印矩陣

第一步 問題分析 遍歷問題,還沒有想到是什麼資料結構,就想著按照思路去列印。第二步 闡述你的思路,比如打算用什麼演算法或者資料結構去解決這個問題,通過描述看是否行得通 自己的思路就是模擬這個列印的過程,先按行從左到右輸出,然後從上到下,再從右到左,再從下到上,順時針迴圈,直到m n個數全部被列印出來...