java输出螺旋数字矩阵

     TIPS:闲暇时看到了一道java输出螺旋数字矩阵的题目,写好之后感觉好久没写博客了,就以这道题写个博客。

     首先看下效果

主要是把矩阵转化为二维数组[n][n],长度为n。比如n=5时
      [0][0],[0][1],[0][2],[0][3],[0][4]
     
      [1][0],[1][1],[1][2],[1][3],[1][4]
     
      [2][0],[2][1],[2][2],[2][3],[2][4]
     
      [3][0],[3][1],[3][2],[3][3],[3][4]
     
      [4][0],[4][1],[4][2],[4][3],[4][4]

 

     说说我的思路,1->5,5->9,9->13,13-16。我把它当作一圈操作,一圈再分别对应4个小操作。

       找规律可以发现,一圈操作主要看,比如图中1,17,25的位置都是圈操作的开始位置,再看下n为偶数的时候。。可以发现当n为偶数时圈数正好是n/2。如果n为奇数最后一次圈操作只操作1个数值比如上面的25。看下代码实现。

    

package com.example.demo;

public class Main {
  
    public static void main(String[] args) {
        int n = 5;
        int[][] result = new int[n][n];
        int r ,l;//数组坐标
        int currentValue = 1;//当前加的值
        int count = n % 2 == 0 ? n / 2 : (n - 1) / 2 + 1;//上下左右各加一次为1圈操作,需要多少次的圈操作
        int m = n - 1;//下标从0开始,这里减一
        for (int j = 0; j < count; j++) {
            r = l = j;
            if (j == count - 1) {
                if (n % 2 != 0) {//这里就是判断如果是奇数的话就直接把最后一个值存入result中然//后退出。
                    result[r][l] = currentValue++;
                    break;
                }
            }
            for (int i = -1; i < m - 2 * j; i++) {//从-1开始,因为从左到右的加操作比下面的操作多一次
                result[r][l++] = currentValue++;
            }
            l--;
            r++;
            for (int i = 0; i < m - 2 * j; i++) {
                result[r++][l] = currentValue++;
            }
            r--;
            l--;
            for (int i = 0; i < m - 2 * j; i++) {
                result[r][l--] = currentValue++;
            }
            l++;
            r--;
            for (int i = 1; i < m - 2 * j; i++) {//一圈最后的操作比上面的少一次,所以i从1开始
                result[r--][l] = currentValue++;
            }
        }
//打印结果
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (result[i][j] < 10) {
                    System.out.print(result[i][j] + " " + " ");
                } else {
                    System.out.print(result[i][j] + " ");
                }
            }
            System.out.println();
        }

    }

}

result就是最后保存结果的地方,currentValue是用来记录当前加到的值,count代表要执行多少次圈的操作。当n为奇数时最后一个数字也当作一圈特殊操作,代码中有描述。最后打印结果。

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值