顺时针打印矩形列表
问题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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
public static ArrayList<Integer> printMatrix(int [][] matrix) {
int n = matrix[0].length;
int m = matrix.length;
if(m == 0 ) return null;
ArrayList<Integer> arr = new ArrayList<Integer>();
int circle = ((Math.min(n, m)-1)/2)+1;//层数
for(int i=0;i<circle;i++){
for(int j = i;j<n-i;j++){//从左往右
arr.add(matrix[i][j]);
}
for(int j=i+1;j<m-i;j++){//从上到下
arr.add(matrix[j][n-i-1]);
}
for(int j=n-i-1-1;j>=i&&(m-i-1!=i);j--){//从右到左
arr.add(matrix[m-i-1][j]);
}
for(int j=m-i-1-1;j>i&&(n-i-1!=i);j--){//从下到上
arr.add(matrix[j][i]);
}
}
return arr;
}
方法2:
public static ArrayList<Integer> printMatrix1(int [][] matrix) {
int n = matrix[0].length;
int m = matrix.length;
if(m == 0 ) return null;
ArrayList<Integer> arr = new ArrayList<Integer>();
int top = 0,left = 0,right = n-1,bottom =m-1;
while(top<=bottom && left<=right){
for(int i = left;i <=right;i++){//从左到右
arr.add(matrix[top][i]);
}
for(int i = top+1;i<=bottom;i++){//从上到下
arr.add(matrix[i][right]);
}
if(top!=bottom){
for(int i = right-1;i>=left;i--){//从右到左
arr.add(matrix[bottom][i]);
}
}
if(left!=right){
for(int i=bottom-1;i>top;i++){//从下到上
arr.add(matrix[i][left]);
}
}
top++;
left++;
right--;
bottom--;
}
return arr;
}