剑指Offer面试题:22.顺时针打印矩阵

一、题目
————————————————
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
图片说明
————————————————
二、思路
————————————————
每次打印矩阵最外面的一圈(用方法printMatrixInCircle()表示),每次都是这个操作,所以可以采用递归。每次打印矩阵的左上角的横纵坐标相同,即为start,而其余三个角的坐标都与行列数以及start有关,因此只需要for循环即可实现打印。

  当然,其实只要针对start进行循环判断,start*2的值小于行数和列数时才需要继续打印,这样,通过这个条件,可以用循环来打印每次的最外圈矩阵。
————————————————
三、解决问题
————————————————
测试算例 
多行多列,单行多列,多行单列,一个数的矩阵,空矩阵,null
————————————————

package swordoffer;

/**
 * @author LQ
 * @version 1.0
 * @date 2020-04-07 9:28
 */

import java.util.ArrayList;

/**
 * 题目描述
 * 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
 * 例如,如果输入如下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 class Solution22 {
    public static void main(String[] args) {
        Solution22 demo = new Solution22();
        System.out.println("==============================");
        demo.test1();
        System.out.println("==============================");
    }
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> ret = new ArrayList<Integer>();
        if((null == matrix) || (0 == matrix.length)){
            return null;
        }
        int row1 = 0, row2 = matrix.length - 1;//行
        int col1 = 0, col2 = matrix[0].length - 1;//列
        while ((row1 <= row2) && (col1 <= col2)){
            //从左到右打印
            for (int i = col1; i <= col2; i++) {
                ret.add(matrix[row1][i]);
            }
            //从上往下的每一列打印
            for (int i = row1 + 1; i <= row2; i++) {
                ret.add(matrix[i][col2]);
            }
            //判断是否会重复打印(从右往左的每一列数据)
            if(row1 != row2){
                for (int i = col2 - 1; i >= col1; i--) {
                    ret.add(matrix[row2][i]);
                }
            }
            //判断是否会重复打印(从下往上的每一行数据)
            if(col1 != col2){
                for (int i = row2 - 1; i > row1; i--) {
                    ret.add(matrix[i][col1]);
                }
            }
            row1++;//行索引+1
            row2--;//行长度-1
            col1++;//列索引+1
            col2--;//列长度-1
        }
        return ret;
    }
    //=====================测试代码=======================
    /*
     * 1.功能测试(A、B为普通二叉树;B是或者不是A树的子结构)
     * 多行多列,单行多列,多行单列,一个数的矩阵,空矩阵,null
     */
    void test1() {
        //多行多列
        int[][] a0= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
        System.out.println(printMatrix(a0));

        //空矩阵
        int[][] a1 = {};
        System.out.println(printMatrix(a1));

        //空矩阵
        int[][] a2 = {{}};
        System.out.println(printMatrix(a2));

        //一个数的矩阵
        int[][] a3 = {{1}};
        System.out.println(printMatrix(a3));

        //单行多列
        int[][] a4 = {{1,2,3,4}};
        System.out.println(printMatrix(a4));

        //多行单列
        int[][] a5 = {{1},{2},{3},{4}};
        System.out.println(printMatrix(a5));

        int[][] a6 = {{1,2,3},{4,5,6}};
        System.out.println(printMatrix(a6));

        //null
        int[][] a7 =null;
        System.out.println(printMatrix(a7));

    }
}

图片说明
————————————————
努力也是需要学习的,别再让你的努力,只感动了自己!愿你的每一次努力,都能为自己和别人创造价值。

Java基础 文章被收录于专栏

建立本人的Java基础技术栈积累库

全部评论

相关推荐

联通 技术人员 总包不低于12
点赞 评论 收藏
分享
三年之期已到我的offer快到碗里来:9硕都比不上9本
点赞 评论 收藏
分享
10-07 20:48
门头沟学院 Java
听说改名就会有offer:可能是实习上着班想到后面还要回学校给导师做牛马,看着身边都是21-25的年纪,突然emo了了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务