龙空技术网

剑指offer(十九):顺时针打印矩阵(Java版)

我是小向同学 125

前言:

而今朋友们对“java打印二维数组”大概比较讲究,各位老铁们都想要知道一些“java打印二维数组”的相关内容。那么小编在网上收集了一些有关“java打印二维数组””的相关知识,希望同学们能喜欢,小伙伴们一起来了解一下吧!

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

第一种解法,首先打印第一行的数据,打印最后一列数据,打印最后一行数据,最后打印第一列数据,这样就完成了矩阵最外面的数据,里面的二维数组是一个新的矩阵,可以套用外面的解法,使用递归来解决,但是遇到只有一列数据或者只有一行数据的时候,得考虑特殊处理。代码如下

public static ArrayList<Integer> firstPrintMatrix(int [][] matrix) {        ArrayList<Integer> list = new ArrayList<>();        if(null == matrix || matrix.length < 1){            return null;        }        print(matrix,list);        return list;    }    public static ArrayList<Integer> print(int [][] matrix,ArrayList<Integer> list){        //行 4        int row = matrix.length;        //列 1        int col = matrix[0].length;        if(row ==1 || col == 1){            for (int i = 0 ; i < row; i++){                for (int j =0 ; j < col ;j++){                    list.add(matrix[i][j]);                }            }        }else {            //第一行  行不变,列变化            for (int i = 0; i < col; i++){                list.add(matrix[0][i]);            }            //最后一列  行变化,列不变            for (int i =  1; i < row; i++){                list.add(matrix[i][col-1]);            }            //最后一行,行不变,列变化            for (int i = col-2; i > -1; i--){                list.add(matrix[row-1][i]);            }            //第一列,行变化,列不变            for (int i = row-2; i > 0; i--){                list.add(matrix[i][0]);            }        }        if (row - 2 > 0 && col - 2 > 0) {            //构造新的二维数组            int array[][] = new int[row - 2][col - 2];            for (int i = 1; i <= row - 2; i++) {                for (int j = 1; j <= col - 2; j++) {                    array[i - 1][j - 1] = matrix[i][j];                }            }            print(array,list);        }        return list;    }

第二种解法,和第一种类似,但是实现逻辑不一样,还是先遍历最外围的数据,然后往内收缩,重新创建一个四边形,代码如下

public static ArrayList<Integer> secondPrintMatrix(int [][] matrix) {    ArrayList<Integer> list = new ArrayList<>();    if(null == matrix || matrix.length < 1){        return null;    }    int top = 0;    //行    int bottom = matrix.length;    int left = 0;    //列    int right = matrix[0].length;    while (top < bottom && left < right){        //第一行  行不变,列变化        for (int i = left; i < right ;i++){            list.add(matrix[top][i]);        }        //最后一列  行变化,列不变        for (int i = top+1; i < bottom; i++){            list.add(matrix[i][right-1]);        }        //最后一行,行不变,列变化        for(int i=right-2;i>=left&&bottom-1!=top;i--){            list.add(matrix[bottom-1][i]);        }        for(int i=bottom-2;i>top&&right-1!=left;i--){            list.add(matrix[i][left]);        }        top++;        bottom--;        left++;        right--;    }    return list;}

完整代码如下

public class MainPrintMatrix {    public static void main(String[] args) {        //int [][]array =  {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};        int [][]array = {{1},{2},{3},{4}};        //int [][]array = {{1,2},{3,4}};        ArrayList<Integer> integers = firstPrintMatrix(array);        System.out.println("integers = " + integers);    }    public static ArrayList<Integer> firstPrintMatrix(int [][] matrix) {        ArrayList<Integer> list = new ArrayList<>();        if(null == matrix || matrix.length < 1){            return null;        }        print(matrix,list);        return list;    }    public static ArrayList<Integer> print(int [][] matrix,ArrayList<Integer> list){        //行 4        int row = matrix.length;        //列 1        int col = matrix[0].length;        if(row ==1 || col == 1){            for (int i = 0 ; i < row; i++){                for (int j =0 ; j < col ;j++){                    list.add(matrix[i][j]);                }            }        }else {            //第一行  行不变,列变化            for (int i = 0; i < col; i++){                list.add(matrix[0][i]);            }            //最后一列  行变化,列不变            for (int i =  1; i < row; i++){                list.add(matrix[i][col-1]);            }            //最后一行,行不变,列变化            for (int i = col-2; i > -1; i--){                list.add(matrix[row-1][i]);            }            //第一列,行变化,列不变            for (int i = row-2; i > 0; i--){                list.add(matrix[i][0]);            }        }        if (row - 2 > 0 && col - 2 > 0) {            //构造新的二维数组            int array[][] = new int[row - 2][col - 2];            for (int i = 1; i <= row - 2; i++) {                for (int j = 1; j <= col - 2; j++) {                    array[i - 1][j - 1] = matrix[i][j];                }            }            print(array,list);        }        return list;    }    public static ArrayList<Integer> secondPrintMatrix(int [][] matrix) {        ArrayList<Integer> list = new ArrayList<>();        if(null == matrix || matrix.length < 1){            return null;        }        int top = 0;        //行        int bottom = matrix.length;        int left = 0;        //列        int right = matrix[0].length;        while (top < bottom && left < right){            //第一行  行不变,列变化            for (int i = left; i < right ;i++){                list.add(matrix[top][i]);            }            //最后一列  行变化,列不变            for (int i = top+1; i < bottom; i++){                list.add(matrix[i][right-1]);            }            //最后一行,行不变,列变化            for(int i=right-2;i>=left&&bottom-1!=top;i--){                list.add(matrix[bottom-1][i]);            }            for(int i=bottom-2;i>top&&right-1!=left;i--){                list.add(matrix[i][left]);            }            top++;            bottom--;            left++;            right--;        }        return list;    }}

标签: #java打印二维数组