【问题标题】:print a mxn matrix spirally - java螺旋打印 mxn 矩阵 - java
【发布时间】:2013-10-30 02:44:53
【问题描述】:

我正在尝试以螺旋方式打印 mxn 大小的矩阵。我尝试通过 Java 处理此代码,如果行 = 列,我能够正确打印螺旋。 对于不相等的行和列,我倾向于在打印中重复。因此它会一直正确打印到中心,但随后会重复一个或多个元素。我尝试调试但无法达到。 谁能帮我这个? 这是我目前得到的代码。

public class SpiralMatrix {
public static void main (String args[]){
    int[][] mat = { {1, 2,  3,  4,  5},
                    {6, 7,  8,  9,  10},
                    {11,12, 13, 14, 15}};
    int i,n=3,m=5,r=m-1,q=n-1;
    while(q>0 && r>0){
        for(i=m-1-r;i<=r;i++){
            System.out.println(mat[m-1-r][i]);
        }
        for(i=n-1-q+1;i<=q;i++){
            System.out.println(mat[i][r]);
        }
        for(i=r-1;i>=m-1-r;i--){
            System.out.println(mat[q][i]);
        }
        for(i=q-1;i>=n-1-q+1;i--){
            System.out.println(mat[i][n-1-q]);
        }
        q--;
        r--;
    }
}
}

这个的输出如下:

1
2
3
4
5
10
15
14
13
12
11
6
7
8
9
8
7

所以在达到中间值 9 后,它会回溯到 8 和 7。 PS:这不是作业,我是在为面试刷技能。请放轻松,我是终身学习者! 谢谢!感谢您的帮助。

【问题讨论】:

    标签: java matrix


    【解决方案1】:

    this question 有关于这个的讨论,你可以在那里看到很多答案。

    我的答案是this one

    看来你只是打印太多了,它似乎来自第三个内部 for 循环(在其他情况下,当高度大于宽度时,可能来自第四个 for 循环)。

    这是因为尽管高度 (q) 是 1,但您是从右到左(第三个内部 for 循环)打印的。这是一个错误,因为如果高度为 1,则该行将由第一个内部 for 循环打印。因此,仅当高度大于 1 时才需要打印条件。第四个内部 for 循环也是如此。

    public class SpiralMatrix {
        public static void main (String args[]){
            int[][] mat = { {1, 2,  3,  4,  5},
                            {6, 7,  8,  9,  10},
                            {11,12, 13, 14, 15}};
            int i,n=3,m=5,r=m-1,q=n-1;
            while(q>0 && r>0){
                for(i=m-1-r;i<=r;i++){
                    System.out.println(mat[m-1-r][i]);
                }
                for(i=n-1-q+1;i<=q;i++){
                    System.out.println(mat[i][r]);
                }
                for(i=r-1;i>=m-1-r && q>1;i--){
                    System.out.println(mat[q][i]);
                }
                for(i=q-1;i>=n-1-q+1 && r>1;i--){
                    System.out.println(mat[i][n-1-q]);
                }
                q--;
                r--;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:
      public class SpiralMatrix {
          public static void main(String[] args) {
              int a[][] = {{1, 2, 3, 4,21,26},
                      {5, 6, 7, 8,22,27},
                      {9, 10, 11, 12,23,28},
                      {13,14,15,16,24,29},
                      {17,18,19,20,25,30},
                      {31,32,33,34,35,36}};
              System.out.println(a[0].length);
              for(int i=0; i<6; i++) {
                  for(int j=0;j<6;j++){
                      System.out.print(a[i][j] + " , ");
                  }
                  System.out.println();
              }
              int m=6,n=6;
      
              for (int i=0;i<m;i++) { 
                  int j=i;
                  for(;j<n;j++){
                      System.out.print(a[i][j] + " , ");
                  }
      
                  for(j=i+1;j<m;j++) {
                      System.out.print(a[j][n-1] +" , ");
                  }
                  for(j=n-2;j>=i;j--){
                      System.out.print(a[m-1][j] + " , ");
                  }
                  for(j=m-2;j>i;j--){
                      System.out.print(a[j][i] + " , ");
                  }
                  m=m-1;
                  n=n-1;          
              }
          }
      
      }
      //tried to simplfy the code to print a square matrix spiral way.
      //complete code given, please post if feel any modification required.
      

      【讨论】:

      • 解释你在做什么,一些代码本身不应该形成答案
      【解决方案3】:

      每次机器人转动 90 度时,您都需要一个 if 条件!

          public static Stack<int> SpiralTraverse(int[,] arr)
          {
              Stack<int> trav = new Stack<int>();
              int m = arr.GetLength(0)-1; //end point (m,n)
              int n = arr.GetLength(1)-1;
              int k = 0; int l = 0; // starting point (k,l)
              int i; //index
              while( k <= m && l <= n)
              {
                  for (i= l; i <= n; i++)
                  {
                      trav.Push((int)arr[k, i]);
                  }
                  k++;
                  for (i = k; i <= m; i++)
                  {
                      trav.Push((int)arr[i, n]);
                  }
                  n--;
                  if (k < m)
                  {
                      for (i= n;i>= l; i--)
                      {
                          trav.Push((int)arr[m,i]);
                      }
                      m--;
                  }
                  if (l < n)
                  {
                      for (i= m;i>= k; i--)
                      {
                          trav.Push((int)arr[i, l]);
                      }
                      l++;
                  }
              }
              return trav;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-23
        • 2022-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-10
        • 2020-07-01
        • 1970-01-01
        相关资源
        最近更新 更多