《程式設計師程式碼面試指南》將正方形矩陣順時針轉動90°
阿新 • • 發佈:2018-12-16
題目 給定一個N×M的矩陣 matrix,把這個矩陣調整為順時針轉動90°後的形式。
例如:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
順時針轉動90°後為:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
解答:
這裡仍使用分圈處理的方法,在矩陣中用左上角的座標(tR,tC)和右下角的座標(dR,dC)就可以表示一個子矩陣。比如題目中的矩陣,當(tR,tC)= (0,0)、(dR,dC)= (3,3)時表示的子矩陣就是整個矩陣,那麼這個子矩陣最外層的部分就是:
1 2 3 4
5 8
9 12
13 14 15 16
在這外圈中1,4,16,13為一組,然後讓1佔據4的位置,4佔據16的位置,16佔據13的位置,13佔據1的位置,一組就調整完了。然後2,8,15,9為一組,最後3,12,14,5為一組,繼續上面的過程。然後(tR,tC)=(0,0)、(dR,dC)=(3,3)的子矩陣外層就調整完畢。接下來令tR和tC加1,即(tR,tC)=(1,1),令dR,dC減1即(dR,dC)=(2,2),
此時表示的矩陣為:
6 7
10 11
方法同上。
public class RotatePrintMatrix { public static void rotate(int[][] matrix){ int tR = 0; int tC = 0; int dR = matrix.length - 1; int dC = matrix[0].length - 1; while(tR < dR){ rotateEdge(matrix, tR++, tC++, dR--, dC--); } } public static void rotateEdge(int[][] matrix,int tR,int tC,int dR, int dC){ int times = dC - tC;//times是總的組數 int tmp = 0; for(int i = 0; i != times; i++){//一次迴圈就是一組佔據的調整 tmp = matrix[tR][tC + i]; matrix[tR][tC + i] = matrix[dR - i][tC]; matrix[dR - i][tC] = matrix[dR][dC - i]; matrix[dR][dC - i] = matrix[tR + i][dC]; matrix[tR + i][dC] = tmp; } } public static void main(String[] args) { int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; rotate(matrix); for(int i = 0; i < matrix.length; i++){ for(int j = 0; j < matrix[i].length; j++){ System.out.print(matrix[i][j] + " "); } System.out.println(" "); } } }
效果
參考資料:《程式設計師面試程式碼指南》左程雲 著