面试常见题—螺旋状矩阵(Java实现)
打印旋转矩阵是求职面试过程中经常遇到的一道题,这里给出了具体的解法。
旋转矩阵如下所示:
源代码如下:
package seekPro;
import java.util.Scanner;
public class luoxuanMatrix {
public static void main(String[] args){
int i,j;
Scanner ip=new Scanner(System.in);
int total = ip.nextInt();
int [][]matrix=new int[total][total];//定义二维数组中元素的个数
matrix=retmatrix(matrix,0,0,1,total);
for(i=0;i<total;i++){
for(j=0;j<total;j++){
if(j==total-1)
System.out.println(matrix[i][j]);
else
System.out.print(matrix[i][j]+" ");
}
}
}
public static int[][] retmatrix(int[][] matrix,int x,int y,int start,int n){
//x,y分别表示矩阵第一个元素的坐标,start表示矩阵的第一个元素,n表示矩阵元素的个数
if(n<=0) return null;
else if(n==1) {
matrix[x][y]=start;
// return matrix;
}
else{
int i,j,k,m;
for(i=y;i<y+n-1;i++){//第一步:行不变,列加1。上面一行,横坐标不变,列坐标逐渐加1,一直到最后一列,但不包括最后一列的元素
matrix[x][i]=start++;
}
for(j=x;j<x+n-1;j++){//第二步:列不变,行加1。右面一列,纵坐标不变,横坐标逐渐加1,一直到最后一行,但不包括最后一行
matrix[j][y+n-1]=start++;
}
for(k=y+n-1;k>y;k--){//第三步:行不变,列减1。下面一行,横坐标不变,纵坐标逐渐减1,一直到最左边的一列,但不包括最左边的一列
matrix[j][k]=start++;
}
for(m=x+n-1;m>x;m--){//第四步:列不变,行减1。左面一列,纵坐标不变,横坐标逐渐减1,一直到最上面的一行,但不包括最上面的一行
matrix[m][k]=start++;
}
retmatrix(matrix,x+1,y+1,start,n-2);//注意此处的各项参数,下一次开始时第一个元素的坐标:(x+1,y+1)
}
return matrix;
}
}
输出结果:
6
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
解法二:常规方法
package seekPro;
import java.util.Scanner;
public class luoxuanMatrix2 {
public static void main(String[] args){
int i,j;
Scanner ip=new Scanner(System.in);
int total = ip.nextInt();
int [][]matrix=new int[total][total];//定义二维数组中元素的个数
matrix=retmatrix(matrix,1,total);
for(i=0;i<total;i++){
for(j=0;j<total;j++){
if(j==total-1)
System.out.println(matrix[i][j]);
else
System.out.print(matrix[i][j]+" ");
}
}
}
public static int[][] retmatrix(int[][] arrays,int start,int n){
int c=0,i,j;
int z = n*n;
int ou=1;
while(ou<=z){
i=0;
j=0;
for(i+=c,j+=c;j<n-c;j++){ //从左到右
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j--,i++;i<n-c;i++){ // 从上到下
if(ou>z) break;
arrays[i][j] = ou++;
}
for(i--,j--;j>=c;j--){//从右到左
if(ou>z) break;
arrays[i][j] = ou++;
}
for(j++,i--;i>=c+1;i--){//从下到上
if(ou>z) break;
arrays[i][j] = ou++;
}
c++;
}
return arrays;
}
}
输出结果:
5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9