我在制作带有环的钻石形状时遇到了麻烦

时间:2014-10-20 06:17:13

标签: java for-loop nested-loops

您输入n,表示钻石所拥有的行数的一半。我能够制作钻石的前半部分,但我对下半场非常沮丧。我似乎无法得到它。我不是在这里要求我需要的具体代码,但是你能指出我正确的方向并给我一些如何写这个的提示/技巧吗?另外,如果我以错误的方式处理这个程序,请随时告诉我并告诉我应该如何处理该程序。

底部的钻石代表输入5 n-1 表示每个星号左侧的空格。谢谢你的帮助!

 public static void printDiamond(int n)
  {
  for(int i=0;i<n;i++)
  {
      for(int a=0;a<(n-(i+1));a++)
      {
          System.out.print(" ");
      }
      System.out.print("*");
      for(int b=0; b<(i*2);b++)
      {
          System.out.print("-");
      }
      System.out.print("*");
      System.out.println();
  } 
}
    **    What I need              **   What I have currently
   *--*                           *--*
  *----*                         *----*
 *------*                       *------*
*--------*                     *--------*
*--------*
 *------*
  *----*
   *--*
    **

4 个答案:

答案 0 :(得分:2)

public static void main(String[] args) {
        int n = 10;
        for (int i = 1 ; i < n ; i += 2) {
            for (int j = 0 ; j < n - 1 - i / 2 ; j++)
                System.out.print(" ");

            for (int j = 0 ; j < i ; j++)
                System.out.print("*");

            System.out.print("\n");
        }

        for (int i = 7 ; i > 0 ; i -= 2) {
            for (int j = 0 ; j < 9 - i / 2 ; j++)
                System.out.print(" ");

            for (int j = 0 ; j < i ; j++)
                System.out.print("*");

            System.out.print("\n");
        }
    }

<强>输出

     *
    ***
   *****
  *******
 *********
  *******
   *****
    ***
     *

答案 1 :(得分:1)

只需扭转你的循环:

    for(int i=n-1;i>=0;i--)
    {
        for(int a=0;a<(n-(i+1));a++)
        {
            System.out.print(" ");
        }
        System.out.print("*");
        for(int b=0; b<(i*2);b++)
        {
            System.out.print("-");
        }
        System.out.print("*");
        System.out.println();
    }

答案 2 :(得分:1)

由于你已经形成了一半的钻石,只需再次反复运行循环,例如:

public static void printDiamond(int n)
{
  for (int i = 0; i < n; i++)
  {
    for (int a = 0; a < (n - (i + 1)); a++)
    {
      System.out.print(" ");
    }
    System.out.print("*");
    for (int b = 0; b < (i * 2); b++)
    {
      System.out.print("-");
    }
    System.out.print("*");
    System.out.println();
  }

  for (int i = n-1; i >= 0; i--)
  {
    for (int a = 0; a < (n - (i + 1)); a++)
    {
      System.out.print(" ");
    }
    System.out.print("*");
    for (int b = 0; b < (i * 2); b++)
    {
      System.out.print("-");
    }
    System.out.print("*");
    System.out.println();
  }
}

答案 3 :(得分:1)

每当我看到一种对称性时,递归就会响起我的脑袋。我只是为你和其他有趣的人发布了更多的知识。开始时,递归可能更难掌握,但由于您已经有了基于循环的解决方案,因此与递归形成对比将清楚地概述优点和缺点。我的建议,不要错过进入它的机会:)

递归解决方案:

static int iteration = 0;
public static void printDiamond(int n) {
    int numberOfBlanks = n - iteration;
    int numberOfDashes = iteration * 2;
    String blank = new String(new char[numberOfBlanks]).replace("\0", " ");
    String dash = new String(new char[numberOfDashes]).replace("\0", "-");
    String star = "*";
    String row = blank + star + dash + star + blank;

    // printing the rows forward
    System.out.println(row);
    iteration++;
    if (iteration < n) {
        printDiamond(n);
    }
    // printing the rows backward
    System.out.println(row);
}

首先,不要与奇怪的新字符串(新字符串[numberOfBlanks])混淆。替换(“\ 0”,“”); 它是java中的一个巧妙的技巧来构造一个带有重复字符的字符串,例如 new String(new char [5])。replace(“\ 0”,“+”); 将创建以下字符串+++++

递归位解释。在递归停止之前,第二个println将不会运行。停止标准由迭代&lt; Ñ。在此之前,将打印直到该点的行。所以像这样:

iteration 1. row =     **     
iteration 2. row =    *--*    
iteration 3. row =   *----*   
iteration 4. row =  *------*  
iteration 5. row = *--------* 

比递归停止,其余代码执行但顺序相反。因此只打印第二个println,行变量的值如下所示

continuing after 5 iteration row =   *--------* 
continuing after 4 iteration row =    *------*  
continuing after 3 iteration row =     *----*   
continuing after 2 iteration row =      *--*    
continuing after 1 iteration row =       **

我没有进入它背后的机制,有足够的资源,这只是为了让你产生好奇心。希望它有所帮助,最好