20顺时针打印矩阵PrintMatrix20

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

import java.util.ArrayList;

/**
 * java 如何获取一个2维数组的长和宽?
 *
 * 如一定义二维数组array[][],则获得该数组的长度(即行数)的代码为array.length,
 * 对于每一行的宽度可以循环获得,如获得第i行的宽度(i的范围是0~array.length-1)的代码为array[i].length。
 *
 * 解题要点:
 * 0、整个数据的循环条件是:columns>startX*2;rows>startY*2;
 * 如果输入的参数和你需要的参数不一样可以用函数嵌套函数,这样可以实现参数的转换
 * 1、发现不知道以什么为起始点:以左上角的坐标为起点;
 * 2、需要计算右上角的列endX=column-1-start;
 *      和右下角的行endY=rows-1-start;
 *3、总共打印分为四步,a:从左到右
 *                              b:从上到下:末端列号>起始列号   endY>start
 *                              c:从右到左: 在b步下,还要末端行号>起始行号, endX>start
 *                              d:从下到上:在第c步的条件下,必须满足,末端列号>=起始列好+2
 *                              可以想如果有的情况下会怎样,如果没有的情况下会怎么样;
 * @author LemonLin
 * @Description :PrintMatrix20
 * @date 2018/3/7-16:52
 */
public class PrintMatrix20 {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> arrayList = new ArrayList<Integer>();
        int col = matrix.length;//列数
        int row= matrix[0].length;//行数
        if (matrix==null||col<=0||row<=0){
            return null;
        }
        int start=0;
        while (start*2<col&&start*2<row){
            PrintMatrixInCircle(matrix,col,row,start,arrayList);
            //一定要记得start要++
            start++;
        }

        return arrayList;
    }

    public void PrintMatrixInCircle(int [][] matrix,int columns,int rows,int start,ArrayList<Integer> arrayList){


        int endX=rows-1-start;
        int endY=columns-1-start;

//      第一步总要执行
        for (int i =start;i<=endX;++i){
            arrayList.add(matrix[start][i]);
        }

//        第二步需要判断末尾列号大于起始列号
        if (start<endY){
            for (int j=start+1;j<=endY;++j){
                arrayList.add(matrix[j][endX]);
            }
        }
//      第三步需要在第二步的基础之上
        if (start<endY&&start<endX){
            for (int i = endX-1;i>=start;--i){
                arrayList.add(matrix[endY][i]);
            }
        }
//      第四步需要在第三部的基础之上
        if (start+1<endY&&start<endX){
            for (int j=endY-1;j>start;--j){
                arrayList.add(matrix[j][start]);
            }
        }
    }
    //测试代码
    public static void main(String[] args) {
        int [][] text={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        int[][] test1 ={{1},{2},{3},{4},{5}};

        System.out.println("二维数组的列的个数"+text.length);
        System.out.println("二维数组的行的个数"+text[0].length);

        PrintMatrix20 printMatrix20= new PrintMatrix20();
        ArrayList<Integer> arrayList = printMatrix20.printMatrix(text);
        for (int i =0;i<=arrayList.size()-1;++i){
            System.out.println(arrayList.get(i));
        }

        System.out.println("二维数组的列的个数"+test1.length);
        System.out.println("二维数组的行的个数"+test1[0].length);
    }
}

猜你喜欢

转载自blog.csdn.net/happy_bigqiang/article/details/79520572