【题目】 给定一个整型矩阵,请按照转圈的方式打印它。
例如:
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
【要求】 额外空间复杂度为O(1)。
【分析】看整体,最外面一圈(顺时针)(1 2 3 4 8 12 16 15 14 13 9 5)输出,去掉最外面一圈后的次外面一圈(顺时针)(6 7 11 10)输出,一直到没有圈了就停止。
【代码】
//1.找好每个圈左上角和右下角的坐标,打印每个圈的数据
public static void rotate(int[][] martix) {
int x1=0;
int y1=0;
int x2=martix.length-1;
int y2=martix[0].length-1;
while(x1<=x2&&y1<=y2) {
printEdge(martix,x1++,y1++,x2--,y2--);
}
}
//2.打印每个圈的方法
public static void printEdge(int[][] matrix, int x1, int y1, int x2, int y2) {
//特殊情况:只有一行(横坐标相等,纵坐标控制移动)
if(x1==x2) {
for(int i=y1;y1<=y2;i++) {
System.out.print(matrix[x1][i]+" ");
}
}
//特殊情况:只有一列(纵坐标相等,横坐标控制移动)
else if(y1==y2){
for (int i =x1 ; i <=x2; i++) {
System.out.print(matrix[i][y1]+"");
}
}
//一般情况:可以围成一个圈的时候
//curX表示的是变化的行,curY表示的是变化的列
else {
int curX=x1;
int curY=y1;
//2.1 先输出和左上角元素在同一行的数据(除了最后一个)(纵坐标控制移动)
while(curY!=y2) {
System.out.print(matrix[x1][curY]+" ");
curY++;
}
//2.2 输出和右下角元素在同一列的数据(除了最后一个)(横坐标控制移动)
while(curX!=x2) {
System.out.print(matrix[curX][y2]+" ");
curX++;
}
//2.3 输出和右下角元素在同一行的数据(除了最后一个)(纵坐标控制移动)
while(curY!=y1) {
System.out.print(matrix[x2][curY]+" ");
curY--;
}
//2.4 输出和左上角元素在同一列的元素(除了最后一个)(横坐标控制移动)
while(curX!=x1) {
System.out.print(matrix[curX][y1]+" ");
curX--;
}
}
}