题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路:思路很清晰,依次左——右,上——下,右——左,下——上,打印。
但是要注意很多边界问题。
第一步:循环
首先我们需要循环,那么循环条键是什么呢?
开始条件
矩阵1:
1, 2, 3, 4, 5
6, 7, 8, 9, 10
11,12,13,14,15
16,17,18,19,20
21,22,23,24,25
第一次我们从1开始循环,他的下边是(0,0)
循环一圈回来,
第二次循环从7开始,他的下标是(1,1)
第三次循环从13开始,他的下标是(2,2)
由此我们可以设置开始坐标(start,start)
由于我们每次循环完一圈,都会减少两行,两列,所以我们只要循环Math.ceil(((double)min(columns,rows))/2)次,也就是,矩阵的长和宽取最小的除2,再向上取整。
第二步:打印
顺时针打印又分为四步
1.首先我们从左到右打印一行,开始坐标是(i,start),
2.然后我从上到下打印一列,此时要求endY>start,也就是说,当这个二维数组有两行以上的时候才打印
3.再从右往左打印,这个时候要求,这个时候要求该二维数组至少有两行两列。endY-start>=1,endX-start>=1
4.从下往上打印,这个时候就需要这个数组至少有三行两列,endY-start>=2,endX-start>=1
代码:
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
int start=0;
int columns=matrix[0].length;
int rows = matrix.length;
while(start<Math.ceil(((double)Math.min(columns, rows)))/2)
{
list.addAll( print(matrix,start,columns,rows));
start++;
}
return list;
}
private ArrayList<Integer> print(int[][] matrix, int start, int columns, int rows) {
ArrayList<Integer> list = new ArrayList<Integer>();
int endX = columns-start-1;
int endY = rows-start-1;
//第一步:从左到右打印一行,如果结束的X<start进行打印
for(int i=start;i<=endX;i++)
{
list.add(matrix[start][i]);
}
System.out.println("a——"+list);
//第二步:从上到下打印,如果y<endY,则打印
if(endY>start)
{
for(int i=start+1;i<=endY;i++)
{
list.add(matrix[i][endX]);
}
}
System.out.println("b——"+list);
//第三步:从右往左打印, 条件是必须有两行两列
if((endX-start)>=1&&(endY-start)>=1)
{System.out.println("33"+matrix[endY][endX-1]);
for(int i=endX-1;i>=start;i--)
{
list.add(matrix[endY][i]);
}
}
System.out.println("c——"+list);
//第四步;从下往上打印,条件是必须有三行两列
if((endX-start)>=1&&(endY-start)>=2)
{
for(int i=endY-1;i>start;i--)
{
list.add(matrix[i][start]);
}
}
System.out.println("d——"+list);
return (ArrayList<Integer>) list;
}