剑指Offer——顺时针打印矩阵

it2022-05-05  168

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.

思路一:1、循环条件的结束。

当矩阵为5*5的时候,最后一圈的左上角元素坐标为(2,2)

当矩阵为6*6的时候,最后一圈的左上角的元素坐标为(2,2)

当矩阵为7*7的时候,最后一圈的左上角的元素坐标为(3,3)......以此类推

得出cols>startX*2并且rows>startY*2;

2、顺时针打印矩阵。第一步由左向右,第二步由上向下,第三步由右向左,第四步由下向上

代码如下

public static ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList alist=new ArrayList(); int rows=matrix.length; int cols=matrix[0].length; if(matrix==null||rows<=0||cols<=0){ return null; } //每圈开始的坐标 int start=0; while(cols>start*2 && rows>start*2){ alist.addAll(printMatrixInCircle(matrix,cols,rows,start)); start++; } return alist; } public static ArrayList<Integer> printMatrixInCircle(int [][] matrix,int cols,int rows,int start){ ArrayList alist=new ArrayList(); int endX=cols-1-start; int endY=rows-1-start; //从左到右打印一行 for(int i=start;i<=endX;i++){ alist.add(matrix[start][i]); //System.out.println(number); } //从上往下打印一列 if(start<endY){ for(int i=start+1;i<=endY;i++){ alist.add(matrix[i][endX]); //System.out.println(number); } } //从右向左打印一行 if(start<endX && start<endY){ for(int i=endX-1;i>=start;i--){ alist.add(matrix[endY][i]); // System.out.println(number); } } //从下向上打印一列 if(start<endX && start<endY-1){ for(int i=endY-1;i>=start+1;i--){ alist.add(matrix[i][start]); //System.out.println(number); } } return alist; }

思路二:直接利用循环:

public static ArrayList<Integer> printMatrix2(int [][] matrix) { ArrayList<Integer> list=new ArrayList(); int rows=matrix.length-1; int cols=matrix[0].length-1; int row=0,col=0; while(row<=rows&&col<=cols){ for(int i=col;i<=cols;i++){ list.add(matrix[row][i]); } for(int i=row+1;i<=rows;i++){ list.add(matrix[i][cols]); } if(row!=rows){ for(int i=cols-1;i>=col;i--){ list.add(matrix[rows][i]); } } if(col!=cols){ for(int i=rows-1;i>=row+1;i--){ list.add(matrix[i][col]); } } row++;col++;rows--;cols--; } return list; }

 


最新回复(0)