转圈打印矩阵
Posted liuwentao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转圈打印矩阵相关的知识,希望对你有一定的参考价值。
【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。
例如:
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)。
public class PrintMatrixSpiralOrder {
public static void main(String[] args) {
int arr[][] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
print(arr);
System.out.println("=================================");
rotate(arr);
}
public static void rotate(int matrix[][]){
int tr = 0; //起点的行坐标。
int tc = 0; // 起点的纵坐标。
int dr = matrix.length-1; //右下角元素的行坐标。
int dc = matrix[0].length-1; //右下角元素的纵坐标。
while (tr<=dr){ //判断跳出循环的条件,相当于层。用tc和dc易可。
rotatePrint(matrix,tr++,tc++,dr--,dc--);
}
}
//每一层的打印方法
//分三种情况:
//1,只有一行
//2,只有一列
//3,其序情况。
public static void rotatePrint(int martix[][],int tr,int tc, int dr,int dc){
if(tr==dr){ //第一种情况。
for (int i=tc;i<=dc;i++){
System.out.print(martix[tr][i]+" ");
}
}else if(tc==dc){ //第二种情况
for (int i=tr;i<=dr;i++){
System.out.print(martix[i][tc]+" ");
}
}else { //设置一个变量,从起点,转圈旋转到起点。
int curR = tr;
int curC = tc;
while (curC!=dc){ //四个where为转圈打印。
System.out.print(martix[tr][curC]+" ");
curC++;
}
while (curR!=dr){
System.out.print(martix[curR][dc]+" ");
curR++;
}
while (curC!=tc){
System.out.print(martix[dr][curC]+" ");
curC--;
}
while (curR!=tr){
System.out.print(martix[curR][tc]+" ");
curR--;
}
}
}
public static void print(int arr[][]){
for (int i =0;i<arr.length;i++){
for (int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
总结:按层打印,确定边界条件。
以上是关于转圈打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章
算法初级面试题03——队列实现栈栈实现队列转圈打印矩阵旋转矩阵反转链表之字打印矩阵排序矩阵中找数