您的位置:首页 > Web前端

剑指offer 4.2 画图形象化问题2- 顺时针打印矩阵

2014-08-11 09:50 204 查看
面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵
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



由于是以从外圈到内圈的顺序依次打印,可以在矩阵中标注一圈作为分析目标。设矩阵的宽度为columns,高度为rows。选取左上角坐标为(startX, startY),右下角坐标为(endX, endY)的一个圈来分析。



由于endX和endY可以根据startX、startY以及columns、rows来求得,因此只需要引入startX和startY两个变量。而打印第一圈时,左上角的坐标是(0,0),打印第二圈时左上角的坐标是(1,1)。所以,其实左上角的坐标中startX和startY是相等的,表示为(start,start)就可以了。

现在可以想象有一个循环,在每一次循环里,从(start,
start)出发按顺时针打印一圈数字。然后start加1,继续打印下一圈。
分析这个循环结束的条件:
对于一个5 x 5的矩阵而言,最后一圈只有1个数字,对应的坐标是(2,2),5 > 2 * 2。
对于一个6 x 6的矩阵而言,最有一个圈有4个数字,左上角坐标是(2,2),6 > 2 * 2。
可以得出,让循环继续的条件是columns > start * 2 && rows > start * 2



接下来讨论如何顺时针打印一圈数字,即printMatrixInCircle()的实现。
可以分4个步骤来打印:
1) 从左到右打印一行(黄色区域):
这一步一定需要。如果只有一行,就不用进行第二步。
2)从伤到下打印一列(绿色区域);
需要第二步的前提是终止行号大于起始行号。
3)从右到左打印一行(蓝色区域);
需要第三步的前提是圈内至少有两行两列,即除去终止行号大于起始行号以外,还需要终止列号要大于起始列号。
4)从下到上打印一列(紫色区域);
需要第四步的前提是至少有三行两列,也就是终止行号比起始行号至少大2,同时终止列号大于起始列号。











内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: