本文参考自《剑指offer》一书,代码采用Java语言。

更多:《剑指Offer》Java实现合集  

题目 

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

思路

  每次打印矩阵最外面的一圈(用方法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);
}

  

  下面的代码是来自牛客网的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实现合集  

  

【Java】 剑指offer(29) 顺时针打印矩阵的更多相关文章

  1. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

  2. 剑指 Offer 29. 顺时针打印矩阵

    剑指 Offer 29. 顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出: ...

  3. 力扣 - 剑指 Offer 29. 顺时针打印矩阵

    题目 剑指 Offer 29. 顺时针打印矩阵 思路1 其实就是按照理解题目的意思一步步从外层到内层打印出来,同时将一个外层分成四个部分分步打印 可以用一个变量count来维护当前打印的第几层 判断打 ...

  4. 剑指offer——29顺时针打印矩阵

    题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数 ...

  5. [剑指offer] 29. 顺时针打印矩阵 (for循环条件)

    思路: 先定义左上和右下角点坐标,打印可分为从左到右,从上到下,从右到左,从下到上.依次判断最后一圈的四个循环条件. #include "../stdafx.h" #include ...

  6. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

  7. 【剑指Offer】顺时针打印矩阵 解题报告(Python)

    [剑指Offer]顺时针打印矩阵 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  8. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  9. 剑指offer得意之作——顺时针打印矩阵

    题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3 ...

随机推荐

  1. Database学习 - mysql数据类型约束

    mysql数据类型 - 属性

  2. Broadcast的类型

    两种发送方法 1.无序广播 对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响.对于这种广播,接收者无法终止广播,即无法阻止其他接收者的 接收动作. 消 ...

  3. java 多线程二

    java 多线程一 java 多线程二 java 多线程三 java 多线程四 线程中断: /** * Created by root on 17-9-30. */ public class Test ...

  4. (原)tensorflow中使用指定的GPU及GPU显存

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6591923.html 参考网址: http://stackoverflow.com/questions ...

  5. 【转】Python介绍

    [转]Python介绍 本节内容 Python简史 Python是一门什么样的语言? Python的优点与缺点 Python解释器 一.Python简史 历史背景 在20世纪80年代,IBM和苹果已经 ...

  6. centos6.5系统bash损坏之救援模式修复

    1.模拟bash被损坏的情况 # mv /bin/bash /tmp [root@localhost ~]# sync [root@localhost ~]# shutdown -r now 2.挂载 ...

  7. Python-浮动 清浮动

    # 浮动布局 ## 一.display总结 ```css/* inline *//*1.同行显示, 就相当于纯文本, 当一行显示不下, 如就是一个字显示不下,那么显示不下的那一个字就会自动换行,和纯文 ...

  8. Python-CSS 基础

    css入门 一.架构分析 页面 => div的层级结构 => 具有采用哪些功能标签显示内容 结构层 > 位置层(布局层) > 内容层 二.css引入 - 行间式 <div ...

  9. .net core定时任务

    1.HangFire HangFire官网 Hangfire项目实践分享 :  讲解的比较详细 2.Quartz.NET https://www.cnblogs.com/best/p/7658573. ...

  10. OCM_第十七天课程:Section7 —》GI 及 ASM 安装配置 _管理和配置 GRID /实施 ASM 故障组 /创建 ACFS 文件系统

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...