【Java】剑指offer(29)顺时针打印矩阵

简介: 【Java】剑指offer(29)顺时针打印矩阵

题目


输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。


思路


每次打印矩阵最外面的一圈(用方法printMatrixInCircle()表示),每次都是这个操作,所以可以采用递归。每次打印矩阵的左上角的横纵坐标相同,即为start,而其余三个角的坐标都与行列数以及start有关,因此只需要for循环即可实现打印。


当然,其实只要针对start进行循环判断, start*2的值小于行数和列数时才需要继续打印,这样,通过这个条件,可以用循环来打印每次的最外圈矩阵。


测试算例 ****


多行多列,单行多列,多行单列,一个数的矩阵,空矩阵,null


Java代码


//题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
public class PrintMatrix {
  public void printMatrix(int[][] matrix) {
  if(matrix==null || matrix.length<=0)
    return;
  printMatrixInCircle(matrix, 0);
  } 
  private void printMatrixInCircle(int[][] matrix,int start) {
  int row=matrix.length;
  int col=matrix[0].length;
  int endX=col-1-start;
  int endY=row-1-start;
  if(endX<start || endY<start)
    return;
  //仅一行
  if(endY==start) {
    for(int i=start;i<=endX;i++) {
    System.out.print(matrix[start][i]+" ");
    }
    return;  //记得结束
  }
  //仅一列
  if(endX==start) {
    for(int i=start;i<=endY;i++) {
    System.out.print(matrix[i][start]+" ");
    }
    return;  //记得结束
  }    
  //打印边界
  for(int i=start;i<=endX;i++) {
    System.out.print(matrix[start][i]+" ");
  }
  for(int i=start+1;i<=endY;i++) {
    System.out.print(matrix[i][endX]+" ");
  }
  for(int i=endX-1;i>=start;i--) {
    System.out.print(matrix[endY][i]+" ");
  }
  for(int i=endY-1;i>=start+1;i--) {
    System.out.print(matrix[i][start]+" ");
  }
  //继续打印更内部的矩阵,令start+1
  printMatrixInCircle(matrix, start+1);
  }
  public static void main(String[] args) {
  PrintMatrix demo = new PrintMatrix();
  int[][] a= {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
//  int[][] a= {};
//  int[][] a= {{}};
//  int[][] a= {{1}};
//  int[][] a= {{1,2,3,4}};
//  int[][] a= {{1},{2},{3},{4}};
//  int[][] a= {{1,2,3},{4,5,6}};
//  int[][] a=null;
  demo.printMatrix(a);
  }


下面的代码是来牛客网:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a的C++代码:

1.采用的是循环;2.在打印一圈时,单行或者单列情况只需要在从右往左打印和从下往上打印时判断是否会出现重复打印(即后面两个for循环)。代码比较简洁。


/*解题思路:顺时针打印就是按圈数循环打印,一圈包含两行或者两列,在打印的时候会
出现某一圈中只包含一行,要判断从左向右打印和从右向左打印的时候是否会出现重复打印,
同样只包含一列时,要判断从上向下打印和从下向上打印的时候是否会出现重复打印的情况*/
class Solution {
public:
    vector<int> printMatrix(vector<vector<int> > matrix) {
        vector<int>res;
        res.clear();
        int row=matrix.size();//行数
        int collor=matrix[0].size();//列数
        //计算打印的圈数
        int circle=((row<collor?row:collor)-1)/2+1;//圈数
        for(int i=0;i<circle;i++){
            //从左向右打印
            for(int j=i;j<collor-i;j++)
                res.push_back(matrix[i][j]);         
            //从上往下的每一列数据
            for(int k=i+1;k<row-i;k++)
                res.push_back(matrix[k][collor-1-i]);
            //判断是否会重复打印(从右向左的每行数据)
            for(int m=collor-i-2;(m>=i)&&(row-i-1!=i);m--)
                res.push_back(matrix[row-i-1][m]);
            //判断是否会重复打印(从下往上的每一列数据)
            for(int n=row-i-2;(n>i)&&(collor-i-1!=i);n--)
                res.push_back(matrix[n][i]);}
        return res;
    }
};


收获


1.打印一圈矩阵时,注意单行或者单列时是否会重复打印。

2.每一圈矩阵左上角的横纵坐标相等,其余三个角的坐标可以由左上角坐标获得。

3.打印矩阵的圈数与其列数或者行数的一半有关。简单但要能想到。


更多《剑指Offer》Java实现合集:https://github.com/gdutxiaoxu/Android_interview


相关文章
|
7月前
|
人工智能 Java 大数据
Java程序员真的还有未来吗?如何备战2024春招?并狂拿大厂offer?
Java程序员还有未来吗? 嘿,小伙伴们,你们有没有想过Java程序员还有没有未来? 哈哈,别担心,我这就来给你们答疑解惑! 首先,让我们来看看Java的发展历程。自从Java诞生以来,它就一直是编程界的一颗璀璨明星。从Web应用到企业级应用,再到移动应用,Java无处不在。那么,现在呢?现在,随着人工智能、大数据和云计算的兴起,Java依然发挥着重要的作用。这些领域都需要大量的Java程序员来支持它们的发展。 那么,有人会说:“哎呀,现在出现了那么多新的编程语言和框架,Java程序员会不会被淘汰啊?”哈哈,别担心,Java程序员们!这些新语言和框架的出现并不会让Java消失。相反,它们
148 0
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
57 6
|
6月前
|
Java
剑指offer_3_前n个数字二进制形式中1的个数(java)
剑指offer_3_前n个数字二进制形式中1的个数(java)
|
6月前
|
Java
剑指offer_2_二进制加法(java)
剑指offer_2_二进制加法(java)
|
6月前
|
Java
剑指offer_1_整数除法(java)
剑指offer_1_整数除法(java)
|
6月前
|
Java
基本矩阵运算的Java实现
基本矩阵运算的Java实现
40 0
|
7月前
|
存储 安全 Java
剑指offer全集系列Java版本(2)
剑指offer全集系列Java版本(2)
45 0
|
7月前
|
存储 Java
剑指offer全集系列Java版本(1)
剑指offer全集系列Java版本(1)
47 0
|
7月前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
7月前
|
Rust 索引
Rust 编程小技巧摘选(5)
Rust 编程小技巧摘选(5)
85 0
Rust 编程小技巧摘选(5)