题目:
输入一个矩阵,按照从外向里的方式按照顺时针依次打印出每一个数字。
输入:
{{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 2 3 4 5 10 15 20 25 24 23 22 21 16 11 6 7 8 9 14 19 18 17 12 13
解题思路:
我们首先可以把矩阵想象成若干个圈,然后不停的向内压缩。然后分析判断条件,首先,我们发现无论是第几圈,左上角位置列和行的坐标总是相同,所以我们可以从一个圈的左上角作为分析条件,对于一个5*5的队列,最后一圈的坐标为(2,2),我们发现最后一圈的坐标2*2<5.所以我么你的判断条件为2*startx<rows && 2*starty<cols
java代码实现:
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] arr={{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}};
print(arr, 5, 5);
}
/**
*
* @param arr 数组矩阵
* @param rows 行数
* @param cols 列数
*/
private static void print(int[][] arr,int rows,int cols){
if(arr==null || rows<0 ||cols<0){
return ;
}
int start=0;
while(start*2<rows &&start*2<cols){
PrintMatrix(arr, rows, cols, start++);
}
}
private static void PrintMatrix(int[][] arr,int rows,int cols,int start){
int endx=cols-start;
int endy=rows-start;
//从左到右是一定会输出的
for(int i=start;i<endx;i++){
System.out.print(arr[start][i]+" ");
}
// 从上到下的条件为大于2列
if (start < endy-1) {
for(int i=start+1;i<endy;i++){
System.out.print(arr[i][endx-1]+" ");
}
}
//从右到左的条件为大于2列并且大于两行
if(start<endy-1&&start<endx-1){
for(int i=endx-2;i>=start;i--){
System.out.print(arr[endy-1][i]+" ");
}
}
//从下到上三行两列
if(start<endy-2&&start<endx-1){
for(int i=endy-2;i>start;i--){
System.out.print(arr[i][start]+" ");
}
}
}