本文参考自《剑指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. 20155332 2006-2007-2 《Java程序设计》第4周学习总结

    20155332 2006-2007-2 <Java程序设计>第4周学习总结 教材学习内容总结 理解封装.继承.多态的关系 理解抽象类与接口的区别 掌握S.O.L.I.D原则 了解模式和设 ...

  2. C++使用目录

    VS2017的安装和配置 常用指令 C++ 数据类型   常量 运算符 数组 字符串  Ansi与Unicode  指针   模态与非模态对话框  变量的引用& new和delete动态分配和 ...

  3. JavaScript之关闭轮询定时器(setTimeout/clearTimeout|setInterval/clearInterval)小结

    已知: 1.1 开启Timeout程序: scope.setTimeout("functionName()" | functionHandle, timeValue) 返回值:ti ...

  4. AAA游戏中雪的实现

    现在越来越多的AAA游戏中都实现了逼真的雪的效果,比如战神4.地平线:黎明时分.荒野大镖客:救赎2.古墓丽影:崛起等都实现了不错的雪地效果.今天我们就来探究一下他们的实现方式.现在主流的实现方式都是通 ...

  5. Jetson tx2的tensorflow keras环境搭建

    其实我一直都在想,搞算法的不仅仅是服务,我们更是要在一个平台上去实现服务,因此,在工业领域,板子是很重要的,它承载着无限的机遇和挑战,当然,我并不是特别懂一些底层的东西,但是这篇博客希望可以帮助有需要 ...

  6. PHP二叉树

    <?php /******************************************************** * 我写的PHP都是从C语言的数据结构中演化而来********* ...

  7. Mybatis入门学习笔记

    1.定义别名 在sqlMapConfig.xml中,编写如下代码: <!-- 定义别名 --> <typeAliases> <!-- type: 需要映射的类型 alia ...

  8. Qt 窗体使用 label 标签插入静态图片

    最近在做毕业设计,上位机软件用的Qt,界面当中需要加入学校校徽,结果百度了n多种方法,有用QPixmap的: QPixmap myPix("./school.jpg"); ui-& ...

  9. 【比赛游记】FJOI2019瞎打记

    \(\mathrm{day}\) \(-4\) 又是睡到中午才起来,这样下去省选会睡迟的. 然后下午在补 WF2019 的题目,很快就能补完的(大雾). \(\mathrm{day}\) \(-3\) ...

  10. RabbitMQ运行机制

    AMQP中消息的路由过程和Java开发者熟悉的JMS存在一些差别,AMQP中增加了Exchange和Binding的角色,生产者把消息发布到Exchange上,Binding决定发布到Exchange ...