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