【题目】 给定一个整型矩阵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)。
打印顺序
实现思想 我们可以定义两个点,一个是左上角的点(tR,tC),一个是右下角的点(dR,dC),利用这两个点即可确定矩阵的一个四周边界,我们可以利用这两个点来打印这四周边界,而里面的值,只需要我们往内挪动这两个点到里面小矩阵的两个角,继续打印. 代码
代码语言:javascript复制package com.day1.practice;
public class PrintEdge {
public static void spiralOrderPrint(int[][] matrix){
// (tR,tC)
//
//
//
// (dR,dC)
int tR=0;//矩阵左上角的行坐标
int tC=0;//矩阵左上角的列左边
int dR=matrix.length-1; //矩阵右下角的行坐标
int dC=matrix[0].length-1;//矩阵右下角的列左边
while (tR<=dR&&tC<=dC){
prindEdge(matrix,tR,tC,dR,dC);
tR ;tC ;
dR--;dC--;
}
}
public static void prindEdge(int[][] matrix, int tR,int tC,int dR,int dC){
if (tR==dR&&tC==dC){ //同点
System.out.print(matrix[0][0] " ");
}
if (tR==dR&&tC!=dC)//同行不同列
{
for(int i=tC;i<=dC;i ){
System.out.print(matrix[tR][i] " ");
}
}
if (tC==dC&&tR!=dR)//同列不同行
{
for(int i=tR;i<=dR;i ){
System.out.print(matrix[i][tC] " ");
}
}
if (tC!=dC&&tR!=dR){//不同列不同行
// (tR,tC)
//
//
//
// (dR,dC)
int currC=tC;
int currR=tR;
while (currC!=dC) { //打印上边框
System.out.print(matrix[tR][currC] " ");
currC ;
}
while (currR!=dR){//打印右边框
System.out.print(matrix[currR][dC] " ");
currR ;
}
while (currC!=tC){//打印下边框
System.out.print(matrix[currR][currC] " ");
currC--;
}
while (currR!=tR){//打印左边框
System.out.print(matrix[currR][currC] " ");
currR--;
}
}
}
public static void main(String[] args){
int [][] matrix = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 10, 11, 12 },
{ 13,14, 15, 16 }
};
spiralOrderPrint(matrix);
}
}