题目:
对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。
给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。
测试样例: [[1,2],[3,4]],2,2
返回:[1,2,4,3]
题目分析:
- 先记录左上角和右下角坐标(这两个坐标就描述了一个矩形)
- 然后先按照顺时针打印这个矩形边上的元素
- 缩小矩形(也就是调整左上和右下坐标位置)
- 再次顺时针打印. 一直缩小到这个矩形为空即可.
代码:
import java.util.Arrays;
import java.util.Scanner;
public class Solution02 {
public static int[] print(int[][] mat,int n,int m){
int[] a=new int[n*m];
int i=0,j=0,k=0;
int startX=0;
int startY=0;
int endX=n-1;
int endY=m-1;
while((startX<=endX) && (startY<=endY)){
//如果只剩下一行
if(startX==endX){
for(;j<= endY;j++,k++){
a[k]=mat[startX][j];
}
return a;
}
//如果只剩下一列
if(startY==endY){
for(;i<= endX;i++,k++){
a[k]=mat[i][startY];
}
return a;
}
//将矩阵上边除右顶点添加到返回的数组中
for(;j<endY;j++,k++){
a[k]=mat[i][j];
}
//将矩阵右边除边下顶点添加到返回的数组中
for(;i<endX;i++,k++){
a[k]=mat[i][j];
}
//将矩阵下边除边左顶点添加到返回的数组中
for(;j>startY;j--,k++){
a[k]=mat[i][j];
}
//将矩阵左边除边上顶点添加到返回的数组中
for(;i>startX;i--,k++){
a[k]=mat[i][j];
}
i++;
j++;
startX++;
startY++;
endX--;
endY--;
}
return a;
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("输入m,n");
int n=sc.nextInt();
int m=sc.nextInt();
System.out.println("输入数组");
int[][] mat=new int[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
mat[i][j]=sc.nextInt();
}
}
System.out.println(Arrays.toString(print(mat,n,m)));
}
}
注意边界值