1.给定一个整形矩阵matrix,请按照转圈的方式打印它。
例如:
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
要求额外空间复杂度为:O(1)
解答:
本题主要介绍一种矩阵处理方式,该方式不仅可用于这道题,还适合很多其他的面试题,就是矩阵分圈处理。在矩阵中用左上角的tr,tc和右下角的dr,dc就可以表示一个子矩阵,比如题目中的矩阵,当(tr,tc)=(0,0),(dr,dc)=(3,3)时,表示的矩阵就是整个矩阵,那么这个子矩阵的最外层部分如下:
1 2 3 4
5 8
9 12
13 14 15 16
如果能把这个子矩阵的外层转圈打印出来,那么在(tr,tc)=(0,0),(dr,dc)=(3,3)时,打印结果为:1 2 3 4 8 12 16 15 14 13 9 5。接下来令tr和tc加1,即(tr,tc)=(1,1),令dr,dc减1,即(dr,dc)=(2,2),此时表示的子矩阵为:
6 7
10 11
在把这个矩阵打印出来,结果为:6 7 11 10。把tr,tc加1,即(tr,tc)=(2,2),令dr,dc减1,即(dr,dc)=(1,1)。发现左上角坐标跑到了右下角坐标的右方或者下方,整个过程就停止。已经打印的结果就是我们要求的结果。具体代码参考如下:
1 public void spiralOrderPrint(int[][] matrix) 2 { 3 int tr=0; 4 int tc=0; 5 int dr=matrix.lenth-1; 6 int dc=matrix[0].length-1; 7 whiel(tr<=dr && tc<=dc) 8 { 9 printEdge(matrix,tr++,tc++,dr--,dc--); 10 11 } 12 } 13 14 public void printEdge(int[][] matrix,int tr,int tc,int dr,int dc) 15 { 16 if(tr==dr) 17 { 18 for(int i=tc;i<=dc;i++) 19 System.out.print(m[tr][i]+" "); 20 } 21 else if(tc==dc) 22 { 23 for(int i=tr;i<=dr;i++) 24 System.out.print(m[i][tc]+" "); 25 } 26 }else 27 { 28 int curc=tc; 29 int curr=tr; 30 while(curc!=dc) 31 { 32 System.out.print(m[tr][curc]+" "); 33 curc++; 34 } 35 while(curr!=dr) 36 { 37 System.out.print(m[curr][dc]+" "); 38 curr++; 39 } 40 while(curc!=tc) 41 { 42 System.out.print(m[dr][curc]+" "); 43 curc--; 44 } 45 while(curr!=tr) 46 { 47 System.out.print(m[curr][tc]+" "); 48 curr--; 49 } 50 }
时间: 2024-10-28 13:43:35