前几天在一道笔试题里看到的,要求输出一个二维矩阵的内容,比如,给定一个二维数组
{{1, 2, 3, 10, 17},
{4, 5, 6, 11, 18},
{7, 8, 9, 12, 19},
{13,14,15,16, 20},
{21,22,23,24, 25}}
输出必须为1 2 3 10 17 18 19 20 25 24 23 22 21 13 7 4 5 6 11 12 16 15 14 8 9,
看似简单地题目花了不少时间来做,写起来不熟练,调试了很多次,如果是笔试或者面试手写的话肯定会挂掉,所以这里重新温习一下。
public class ClockwisePrint {
public static void main(String[] args) {
// TODO Auto-generated method stub
int [][] a = {{1, 2, 3, 4, 5},
<span style="white-space:pre"> </span> {4, 5, 6, 7, 8},
{7, 8, 9, 10, 6},
{27,18, 19,11, 10},
{1, 2, 3, 4, 5},
{4, 5, 6, 7, 8},
{7, 8, 9, 10, 6},
{1, 2, 3, 4, 5},
};
ClockwisePrint c = new ClockwisePrint();
c.colokWisePrint(a);
}
public void colokWisePrint(int a[][]){
int width = a[0].length;
int height = a.length;
int startX = 0;
int startY = 0;
int endX = startX + height-1;
int endY = startY + width -1;
while(true){
if(startX > endX || startY > endY)
break;
if(startX < endX && startY < endY){
print(a, startX, startY, endX, endY);
startX ++;
startY ++;
endX --;
endY --;
}
if(startY <=endY && startX == endX)//说明只有一行数据,输出由左至右即可
{
for(int i = startY ; i <= endY ; i++){
System.out.print( a[startX][i] + " ");
}
break;
}
if(startX <=endX && startY == endY){//说明只有一列数据,直接由上到下输出
for(int i = startX ; i<= endX ; i++){
System.out.print( a[i][startY] + " ");
}
break;
}
}
}
public void print(int [][] a,int startX,int startY,int endX,int endY){
for(int i = startY;i<= endY ; i++){
System.out.print(a[startX][i] + " " );//输出第一行数据
}
for(int i = startX+1 ; i <= endX ; i ++){
System.out.print(a[i][endY] + " "); // 输出第一竖列数据
}
for(int i = endY-1 ; i >= startY ; i--){
System.out.print(a[endX][i] + " ");//输出第二行数据
}
for(int i = endX-1 ; i >= startX+1 ; i--){
System.out.print(a[i][startY] + " ");//输出最后一列数据
}
System.out.println();//打印换行以便层数的查看
}
}
运行结果:
1 2 3 4 5 8 6 10 5 8 6 5 4 3 2 1 7 4 1 27 7 4
5 6 7 10 11 4 7 10 9 8 5 2 18 8
9 19 3 6