计算层数,每层四个动作:左上到右上,右上到右下,右下到左下,左下到左上。
层数计算:矩阵中宽高最小值记为i,则层数为i/2+i%2。理解这个需要画图,按i为奇数和偶数考虑。为偶数,则每层需要所占空间都是两格,所以偶数直接除二就是层数。为奇数则还会剩一层(画个图就明白了),而这一层也会是一层,所以奇数还要加一。故有上式。
先用变量表示出矩阵宽高,界定别出错。还有就是打好补丁, 发现3*n(n>4)的矩阵时第二层明明只应该打一行从左上到右上,但实际又打了右下到左下。解决这个问题只需要在这个过程的for循环的判定条件上加上(height-1)/2!=j即可。
完整代码:
package exercise1;
import java.util.ArrayList;
public class Solution {
public static ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> result = new ArrayList();
int width = matrix[0].length;
int height = matrix.length;
int i = Math.min(width, height)/2 + Math.min(width, height)%2;
for(int j= 0;j < i;j++){
for(int k = j;k < width-j;k++){
result.add(matrix[j][k]);
}
for(int k = j + 1;k < height - j;k++){
result.add(matrix[k][width-1-j]);
}
for(int k=width-j-2;(k>=j)&&(height-1)/2!=j;k--){
result.add(matrix[height-j-1][k]);//右至左
}
for(int k=height-j-2;(k>j);k--){
result.add(matrix[k][j]);//左下至左上
}
}
return result;
}
public static void main(String[] args) {
int [][]arr={
{1,2,3,4},
{4,5,6,7},
{7,8,9,10},
};
ArrayList<Integer> result = printMatrix(arr);
for(int i = 0;i < result.size();i++){
System.out.println(result.get(i));
}
}
}