顺时针打印矩阵
顺时针打印矩阵
http://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a
打印是有规律的,以最外一圈为例,设矩阵为i行j列,即a[i][j]
(1)从a[0][0]打印到a[0][j]
(2)从a[j][1]打印到a[i][j]
(3)从a[i][j-1]打印到a[i][0]
(4)从a[i-1][0]打印到a[1][0]
最外一圈打印完毕,如果将最外一圈删掉形成新的数组,那么依然可以如上所述进行打印,
非正方形矩阵最后的情况是剩一行,或者一列,对这两种情况分别进行处理。
如果是正方形的矩阵,最后是剩四个元素,此时数组不再刷新,直接打印完毕即可。
以下是代码
import java.util.ArrayList; public class PrintMatrix { ArrayList<Integer> list=new ArrayList<Integer>(); int i=0,j=0; public ArrayList<Integer> printMatrix(int [][] matrix) { if(matrix==null) return list; i=0;j=0; //当最后只有一行时 if(matrix.length==1&&matrix[0].length>=1) { for(j=0;j<matrix[0].length;j++) { list.add(matrix[0][j]); } return list; } //d当最后只有一列时 else if(matrix[0].length==1&&matrix.length>1) { for(i=0;i<matrix.length;i++) { list.add(matrix[i][0]); } return list; } //对外圈元素进行顺时针打印 else { while(j<matrix[0].length) { list.add(matrix[i][j]); j++; } j--;i++; while(i<matrix.length) { list.add(matrix[i][j]); i++; } i--;j--; while(j>=0) { list.add(matrix[i][j]); j--; } j++;i--; while(i>=1) { list.add(matrix[i][j]); i--; } int[][] newMatrix=fresh(matrix); list=printMatrix(newMatrix); } return list; } //“刷新”数组,即删掉数组的最外一圈元素 private int[][] fresh(int[][] matrix) { if(matrix.length<=2||matrix[0].length<=2) return null; int[][] newMatrix=new int[matrix.length-2][matrix[0].length-2]; int i=1,j=1; for(i=1;i<matrix.length-1;i++) { for(j=1;j<matrix[0].length-1;j++) { newMatrix[i-1][j-1]=matrix[i][j]; } } return newMatrix; } }