• 编程题之--打印二维螺旋矩阵


    当size=4时, 二维螺旋矩阵如下图所示:

    规律总结

      可以把这个二维矩阵看成一层套一层,如上图所示,1->4->7->10->12为第零层,

    13->14->15->16为第一层,所以当size=4时,总共有两层。规律如下:

    1. 可分层数为:若size为偶数,层数=size/2, 若为奇数,则层数=(size+1)/2;
    2. 第n层一个方向上的数字的数量为:size-2*n;

      这是因为第零层的一个方向上数字的数量就是size, 而第一层是size-2,...第n层就是size-2*n;

    3. 第n层上数字的数量为4*(size-2*n) - 4,这里的size-2*n就是(2)中一个方向上的数字的数量。

      由此推知,若第n层的第一个数字为x,则第n+1层的第一个数字为x+4*(size-2*n)- 4,

      例如4*4矩阵中,第0层的第一个数字为1, 则第1层的第一个数字为1 + 4 * 4 - 4 = 13。

    代码

    有了以上的规律,就可以写代码了,博主的代码如下,供参考。

    其中,在填充每一层的数字时,下,左,上都重复了第一个数字,并且要注意的是,最后向上的一步不能覆盖这一层的首数字

    具体以本文开头的那个图为例,第零层填充顺序就是:

            右:1,2,3,4,;

            下:4,5,6,7

            左:7,8,9,10

            上:10,11,12。

    向上的如果在写成:10, 11, 12, 13就把开头的数字1给冲掉了。

     1 public class SnakeArray {
     2 
     3     public static int[][] fillSnakeArray(int size) {
     4         int[][] sa = new int[size][size];
     5         int startEle = 1;
     6         int layerNum = (size % 2 == 0) ? size / 2 : (size + 1) / 2;
     7         for (int layer = 0; layer < layerNum; layer++) {
     8             fillLayer(size, startEle, layer, sa);
     9             int sizeInLayer = size - 2 * layer;
    10             startEle += 4 * (sizeInLayer - 1);
    11         }
    12         return sa;
    13     }
    14 
    15     public static void fillLayer(int size, int startEle, int layer, int[][] sa) {
    16         int layerSize = size - 2 * layer;
    17         int eleTmp = startEle;
    18 
    19         int row = layer;
    20         int col = layer;
    21         //(1) >
    22         for (int i = 0; i < layerSize; i++) {
    23             sa[row][col++] = eleTmp++;
    24         }
    25         col -= 1;
    26         eleTmp -= 1;
    27         //(2) V
    28         for (int i = 0; i < layerSize; i++) {
    29             sa[row++][col] = eleTmp++;
    30         }
    31         row -= 1;
    32         eleTmp -= 1;
    33         //(3) <
    34         for (int i = 0; i < layerSize; i++) {
    35             sa[row][col--] = eleTmp++;
    36         }
    37         col += 1;
    38         eleTmp -= 1;
    39         //(4) ^ 防止覆盖这一层的第一个数字,循环到layerSize-1而不是layerSize
    40         for (int i = 0; i < layerSize - 1; i++) {
    41             sa[row--][col] = eleTmp++;
    42         }
    43     }
    44 
    45     public static void main(String[] args) {
    46         int n = 5;
    47         int[][] sa = fillSnakeArray(n);
    48         for (int i = 0; i < n; i++) {
    49             for (int j = 0; j < n; j++) {
    50                 System.out.print(sa[i][j] + ",");
    51             }
    52             System.out.println(" | ");
    53         }
    54     }
    55 }

     运行结果:

    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, | 
  • 相关阅读:
    Java 基础
    Java 数据类型
    Spring 拦截器实现事物
    SSH 配置日记
    Hibernate 知识提高
    Jsp、Servlet
    leetcode 97. Interleaving String
    leetcode 750. Number Of Corner Rectangles
    leetcode 748. Shortest Completing Word
    leetcode 746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/tlz888/p/7096900.html
Copyright © 2020-2023  润新知