面试常见题—螺旋状矩阵(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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值