题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:
从左上到右上,右上到右下,右下到左下,左下到左上,依次打印,注意确定打印的圈数(min(行数,列数)/2+1);注意拐点处是否要加1减1,不要重复打印;还要注意停止打印的条件(找规律)。
代码:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> arraylist = new ArrayList<Integer>();
int m = matrix.length-1;//m行
int n = matrix[m].length-1;//n列
if(n == 0){//列数是0
for(int k = 0; k <= m; k++){
arraylist.add(matrix[k][0]);
}
return arraylist;
}
if(m == 0){//行数是0
for(int k = 0; k <= n; k++){
arraylist.add(matrix[0][k]);
}
return arraylist;
}
int i = 0;//i行
int j = 0;//j列
int layer = (Math.min(m,n)/2) + 1;
int l = 0;
while(l < layer){
for(int k = i; (k <= n-i) && (n-l >= l); k++){//左到右,行不变,列变
arraylist.add(matrix[i][k]);
}
for(int k = j+1; (k <= m-j) &&(m-l >= l); k++){//右上到右下,行变,列不变
arraylist.add(matrix[k][n-j]);
}
for(int k = n-j-1; (k > j) && (m-l > l); k--){//右下到左下,行不变,列变
arraylist.add(matrix[m-i][k]);
}
for(int k = m-i; k > i; k-- ){//左下到左上,行变,列不变
arraylist.add(matrix[k][j]);
}
i++;
j++;
l++;
}
return arraylist;
}
}