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

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.

当遇到一个复杂的问题的时候,我们可以用图形来帮助我们来思考。由于是从外圈到内圈的顺序依次打印,我们可以把矩阵想象成若干个圈,如图所示。我们可疑用一个循环来打印矩阵,每一次打印矩阵中的一个圈。

接下来分析循环结束的条件。假设这个矩阵的行数是rows,列数是columns。打印第一个圈是左上角元素的坐标是(0,0),第二圈的左上角的坐标是(1,1),以此类推。我们注意到,左上角的坐标中行标和列标总是相同的,于是可疑在矩阵中选取左上角为(start,start)的一圈为我们分析的目标。

对一个5*5的矩阵而言,最后一圈只有一个数字,对应的坐标为(2,2)。我们发现5>2*2.对于一个6*6的矩阵而言,最后一圈有4个数字,其左上角的坐标仍然为(2,2)。我们发现6>2*2依然成立。于是我们可以得出继续循环的条件是columns>startX*2并且rows>startY*2.

接着我们考虑如何打印一圈的功能,即如何实现PrintMatrixInCircle。如图所示,我们可以把打印一圈分为四步:第一步从做到右打印一行,第二步从上到下打印一行,第三步从右到左打印一行,第四步从下到上打印一列。每一步我们根据起始坐标用一个循环就能打印出一行或者一列。

不过值得注意的是,最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字,因此打印这样的一圈就不再需要四步。图是几个退化的例子,打印一圈分别只需要三步、两步甚至只有一步。

因此我们要仔细分析打印时的每一步的前提条件。第一步总是需要的,因为打印一圈至少需要一步。如果只有一行,那么就不用第二步了。也就是需要第二步的前提条件是终止号大于起止号。需要第三步打印的前提条件是圈内至少有两行两列,也就是说除了要求终止行号大于起始行号之外,还要求终止列号大于起始列号。同理,需要打印第四步的前提条件是至少有三行两列,因此要求终止行号比其实行号至少大2,同时终止列号大于起始列号。

实现代码如下:

/** * 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 */package swordForOffer; /** * @author JInShuangQi * * 2015年8月2日 */public class E20PrintMatrix {public void printMatrixInCircle(int[][] array){if(array == null)return;int start = 0;while(array[0].length > start*2 && array.length >start*2){printOneCircle(array,start);start++;}}private void printOneCircle(int[][] array,int start){int columns = array[0].length;int rows = array.length;int endX = columns - 1 - start;int endY = rows - 1 - start;//从左到右打印一行for(int i = start;i <= endX ;i++){int number = array[start][i];System.out.print(number+

java 打印_剑指Offer面试题20(Java版):顺时针打印矩阵相关推荐

  1. leetcode 打印_剑指 Offer 32 - III 从上到下打印二叉树 III - leetcode 剑指offer

    题目难度: 中等 原题链接 今天继续更新剑指 offer 系列, 这道题相比昨天那道题多了个每层打印方向不同的需求, 聪明的你想到应该如何实现了吗? 老样子晚上 6 点 45 分准时更新公众号 每日精 ...

  2. 剑指offer——面试题60:把二叉树打印成多行

    剑指offer--面试题60:把二叉树打印成多行 Solution1: 20180911重做.经典题目.牢记做法! /* struct TreeNode {int val;struct TreeNod ...

  3. 剑指offer——面试题20:顺时针打印矩阵

    剑指offer--面试题20:顺时针打印矩阵 Solution1: 可参考leetCode 54题的解法 书上的思路特别好,学习之~ class Solution { public:vector< ...

  4. Java详解剑指offer面试题50--第一个只出现一次的字符

    Java详解剑指offer面试题50–第一个只出现一次的字符 找出字符串中找出第一个只出现一次的字符,比如输入"abacceff",则输出'b' 要想知道某个字符是不是只出现了一次 ...

  5. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  6. leetcode 打印_剑指 Offer 总结 - leetcode 剑指offer系列

    剑指 Offer 系列完结撒花!! 本篇文章是对整个系列的精华总结, 对系列的每篇文章进行了分类, 并用一句话概括每道题的思路, 方便大家理解和记忆, 当然也包含原文完整链接供大家参考 总的来说, 写 ...

  7. 两个数组中对应的下标的值合成一个新的数组_剑指 offer 面试题精选图解 03 . 数组中重复的数字

    今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...

  8. 二维数组的空间复杂度_剑指 offer 面试题精选图解 04 . 二维数组中的查找

    点击关注上方"图解面试算法", 设为"置顶或星标",一起刷 LeetCode. 作者:程序员吴师兄 今天分享的题目来源于 LeetCode 上的剑指 Offer ...

  9. 剑指offer面试题[20]-顺时针打印矩阵

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

最新文章

  1. SharePoint 2010 各个常用级别对象的获取
  2. 向net core 3.0进击——April.WebApi从2.2爬到3.0
  3. setnx和expire合成一条指令_Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?...
  4. [通俗易懂]深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
  5. 点云平面提取_基于LiDAR点云数据滤波方法
  6. java 调制信号,常见调制技术汇总
  7. User Agent跨站攻击
  8. centos ssh配置使用
  9. HTML5 — 知识总结篇《IV》【实体字符】
  10. Win7梦幻桌面字体有问题怎么办
  11. 怎么把excel文件转成dta_dta数据格式在excel表格中打开-怎么才能把excel文件格式转化为dat格式?...
  12. 乐视路由器刷机后修改固件成art信息
  13. Qt 中信号和槽机制
  14. 手机端Alook浏览器手动抓取京东Cookie教程
  15. mysql安装所需最低配置数据_MySQL的安装与基本配置
  16. 全套机密PS技术,你在学校里十二年,也学不到这么多
  17. python26章_44G-26章节Python盖世修炼最新实战 全新升级版Python全栈架构师高级课程 从零实战...
  18. python如何生成26个英文字母(包括大小和小写)以及附上英文可见(常用)字符的ASCII码表。
  19. tensorflow: bn层 的 decay参数项
  20. 【QGIS插件安装】buildseg: QGIS plugin for building extraction

热门文章

  1. 前端开发 标签的属性和值 0228 需演练
  2. linux-命令模式-光标定位-编辑中20.22
  3. python-socket客户服务端的传输原理异常关闭的情况
  4. jquery-ui寺
  5. go 简单的RPC服务与客户端通讯
  6. Python3 数据库连接
  7. 用Canvas为网页加入动态背景
  8. Unicode汉字编码
  9. 生化危机5 / BIOHAZARD5 简直就是一款完美的印钞机?(+2009.4.9)
  10. 虚拟打印的实现-安装