1. 程式人生 > >輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8

輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下矩陣: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次打印出數字1,2,3,4,8

import java.util.ArrayList;
import java.util.Arrays;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> list = new ArrayList<Integer>();
       int[][] m = matrix;
        
       //一般情況:多行多列
       while(m.length > 1 && m[0].length > 1){
             
            for(int i = 0; i < m[0].length; ++i){
                list.add(m[0][i]);
            }
            m = rotateMatrix(eraseFirstRow(m));
        }
         
        //只有一行或一列
        if(m[0].length == 1){
           for(int i = 0; i < m.length; ++i){
                list.add(m[i][0]);
           }
           return list;
        }
        if(m.length == 1){
           for(int i = 0; i < m[0].length; ++i){
                list.add(m[0][i]);
           }
           return list;
        }
         
        return list;
    }
     
    //矩陣逆時針旋轉90度
    public static int[][] rotateMatrix(int[][] matrix){
        int col = matrix[0].length;
        int row = matrix.length;
        int[][] rotateMatrix = new int[col][row];
         
        for(int i = col-1; i >= 0; i--){
            for(int j = 0; j < row; j++){
                rotateMatrix[col-1-i][j] = matrix[j][i];//原矩陣從右往左、從上到下,新矩陣從左到右、從上往下
            }
        }
         
        return rotateMatrix;
    }
 
    //刪除矩陣的第一行並返回新的矩陣
    public static int[][] eraseFirstRow(int[][] matrix){
        int col = matrix[0].length;
        int row = matrix.length;
        int[][] erasedMatrix = new int[row-1][col];
        for(int i = 1; i < row; i++){
            for(int j = 0; j < col; j++){
                erasedMatrix[i-1][j]=matrix[i][j];
            }
        }
        return erasedMatrix;
    }
}