题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
例如,如果输入如下4 X 4矩阵: 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。
思路分析:当我们顺时针打印该矩阵时,每一圈的起始位置是左上角的元素,并且每一圈左上角元素都有一个共同点:它的行和列所对应的的下标都是相同的。所以不难想到,该矩阵打印结束的条件就是左上角的元素下标走到了该矩阵行和列的一半时该矩阵也就打印结束了。因为矩阵也是用下标来确定某个数字的,所以这里就是:4>1×2(左上角下标为(1,1)时时最后一圈)
可是,我们上面给的矩阵很特殊,并且行和列的都是偶数个,不具有说服力,我们还需要考虑考虑其他的情况,以验证我们得到的结论是否具有普遍性。例如:一个7×7的矩阵,将该矩阵打印结束的条件就是:左上角的元素为(3,3)时,也就是说7>3×2
这里乘二也是因为矩阵每打印完一圈,对应的下三角部分已经打印过了。
现在还有一个问题,就是如何打印矩阵的每一圈:
如上图,矩阵打印一圈需要四步,这个是一般情况。
当我们的矩阵是行大于列、列大于行的时候可能不需要四步,就可以打印结束:
从上图不难看出所有情况中是都出现了从左向右打印,而其他方向的打印则时有时无,这就需要加判断函数,判断当前这一圈是否需要打印这三个方向上的数字:
(1)从上到下:矩阵行数至少为2,即:终止行号必须大于起始号(这里不可以等于哦,否则会产生矩阵右上角的元素重复多打印一次);
(2)从右往左:矩阵至少为两行两列,即:终止列号必须大于起始号,并且终止行号必须大于起始号(同样,不可以等于,否则矩阵右下角的元素会多打印一次);
(3)从下到上:矩阵至少为三行两列,即:终止行号必须比起始号大2,并且终止号必须大于起始号(同样,不可以等于,否则会出现左下角和右上角元素多打印一次)
打印思路具体如下(例如是一个5×4的矩阵):
使用while循环打印,初始化初始起始号(start)为0,每次循环打印一圈后初始号自增。
循环函数:
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
int row