循环的java打印模式

时间:2016-02-18 18:20:08

标签: java for-loop

我已经远远地搜索了我遇到的这个问题的解决方案。我正在走上正轨(我想),但没有正确地思考一些逻辑,所以想知道我是否能为此得到一些帮助。

  for (int i = 0; i < 6; i++)
  {
     for (int j = 0; j < i; j++)
     {
        System.out.print(" ");
     }
     System.out.println("#");

  }
  for (int l = 0; l < 6; l++)
  {
     for (int m = 6; m > l; m--)
     {

        System.out.print(" ");
     }
     System.out.println("#");

  }

Output: #
         #
          #
           #
            #
             #
              #
             #
            #
           #
          #
         #

我想要实现的是 output: # # # # # # # # # # # # # # # # # # #

4 个答案:

答案 0 :(得分:0)

这是一些帮助,在明确和突出显示的步骤中,所以你可以阅读第一个并尝试,然后转到下一个...为了避免破坏解决方案:)

帮助1

观察到模式有点规律,但每行开头都有一些“噪音”......首先,尽量避免打印初始空格。而不是

     #           #
      #         # #
       #       #   #
        #     #     #
         #   #       #
          # #         #
           #           #

考虑

     #           #
     #         # #
     #       #   #
     #     #     #
     #   #       #
     # #         #
     #           #

帮助2

显然,每行的大小与第一个#到最后一个#的大小相同。所以,你必须“在中间移动一个。基本上,这意味着每一行都由固定的#,空格,可移动的#,空格,另一个固定的#组成。

帮助3

你如何“移动”中间人? 空格数是否会发生变化?第一个和最后一个#之间的空格数不会改变。 因此,您有固定数量的空格(例如10),但您在其间插入了一些内容。空间的模式将是这样的:0#10,1#9,2#8,...,9#1,10#0。你如何用一个循环来做到这一点?

答案 1 :(得分:0)

我不会解决生成所需图表的解决方案。相反,我想评论原始代码中的几个错误。

您发布的代码有2个主要for循环。每个,根据你设定的条件:

int i = 0; i < 6; i++

会导致

System.out.println("#");

在六条不同的行上打印6“#”。

由于你有两个for循环执行println(),它们将导致程序总共显示12行,而不管每个main for循环中的子for循环,因为sub-for循环仅用于显示白色打印“#”之前的空格。

答案 2 :(得分:0)

将输出存储在char double数组中,然后在遍历数组时替换斑点。

int height = 6;
int peeks = 5;
// the top and bottom peaks share a point with eachother
// so for every down and up there are "2*height - 2" points
// the last peak has no connection, so add 1
int duration = (peeks*2*(height - 1)) + 1;

// create a double array and fill it with spaces
char[][] output = new char[height][duration];
for(int i = 0; i < height; i++){
    for(int j = 0; j < duration; j++){
        output[i][j] = ' ';
    }
}

// keep track of if we are going up or down
boolean increment = true;

for(int distance = 0, level = 0; distance < duration; distance++){
    // mark every point in the path
    output[level][distance] = '#';
    if (level == 0){
        increment = true;
    }
    else if (level == height -1){
        increment = false;
    }
    level += increment? 1 : -1;
}

// print each line in the double array
for(int i = 0; i < output.length; i++){
    System.out.println(String.valueOf(output[i]));
}

答案 3 :(得分:0)

我确信有一个更优雅的解决方案,但这里有一些具有您所要求的确切输出的粗暴算法:

   int spaceCount1 = 9;
   int spaceCount2 = 11;
   int spaceCount3 = 0;
   int j = 1;
   for(int row = 0; row < 7; row++){
       System.out.println();
       for(int i = 0; i < spaceCount1; i++){
           System.out.print(" ");
       }
       spaceCount1++;
       for(j = 1; j <= 1; j++){
            System.out.print("#");
       }
       j--;
       for(int i = spaceCount2; i > 0; i--){
            System.out.print(" ");
       }
       spaceCount2 -= 2;

       for(j = 1; j <= 1 && row < 6; j++){
            System.out.print("#");
       }
       j--;
       for(int i = 1; i < spaceCount3 ; i++){
           System.out.print(" ");
       }
       spaceCount3 += 2;
       for(j = 1; j <= 1 && row > 0; j++){
           System.out.print("#");
       }
       j--;
  }

输出:

     #           #
      #         # #
       #       #   #
        #     #     #
         #   #       #
          # #         #
           #           #