剑指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基础技术栈积累库