四.转圈打印矩阵

【题目】 给定一个整型矩阵,请按照转圈的方式打印它。
例如:

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--;
		}
	}		
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值