显示数字梯子金字塔

时间:2018-04-04 14:39:27

标签: java

我在下面做了这个,但我没弄错,

int i = 1;
       while(i <= 6){
             for(int j = 1;j <= 6-i;j++){
                   System.out.print("  ");
            }
            for(int m = 1; m <= i; m++){
                   System.out.print(m + " ");
            }
            i++;
            System.out.println();
     }

我得到了这个:

             1
           1 2
         1 2 3
       1 2 3 4
     1 2 3 4 5 
   1 2 3 4 5 6

但是我需要有关如何在下面进行此操作的指南,

          1
        2 1 2
      3 2 1 2 3
    4 3 2 1 2 3 4
  5 4 3 2 1 2 3 4 5  

4 个答案:

答案 0 :(得分:5)

while(i <= 6){
    for(int j = 1; j <= 6 - i; j++){
        System.out.print("  ");
    }
    for(int m = i-1; m > 1; m--){
        System.out.print(m + " ");
    }
    for(int m = 1; m < i; m++){
        System.out.print(m + " ");
    }

    i++;
    System.out.println();
}

这应该对你有用,我刚刚添加/编辑了这部分:

    for(int m = i-1; m > 1; m--){
        System.out.print(m + " ");
    }
    for(int m = 1; m < i; m++){
        System.out.print(m + " ");
    }

让它再次倒计时,然后让它计数

答案 1 :(得分:3)

这应该可以解决问题,但重要的是要了解发生了什么:

public class Main {

    public static void main(String[] args) {

        for (int i = 0; i <= 6; i++) {
            printRow(6, i);
        }
    }

    public static void printRow(int highestValue, int rowValue) {

        for (int i = 0; i < (highestValue - rowValue); i++) {
            System.out.print("  ");
        }

        for (int i = rowValue; i >= 1; i--) {
            System.out.print(i + " ");
        }

        for (int i = 2; i <= rowValue; i++) {
            System.out.print(i + " ");
        }

        System.out.println();
    }
}

第一个循环填充了金字塔的左侧,就像您已经完成的那样。第二个循环将 down 从行的值计算到1,这是金字塔的中心。第三个循环从<{1}}计算 up 到行的值。请注意,对于第一行,不会打印2,因为2大于i = 2,即rowValue,因此会跳过循环。

运行此结果会产生以下结果:

1

请注意,由于我使用了您提供的边界,因此会打印以 1 2 1 2 3 2 1 2 3 4 3 2 1 2 3 4 5 4 3 2 1 2 3 4 5 6 5 4 3 2 1 2 3 4 5 6 开头的行。如果这不是应该做的(从您的示例输出),我将由您决定如何解决这个问题。请注意6方法中参数的名称,以查看为什么打印了额外的行。

答案 2 :(得分:1)

你有我的解决方案,使用绝对值的小智能解决方案,注意为什么在哪里

public static void printPyramid(int rows) {
        // row counter
        for (int i = 1; i <= rows; i++) {

            // padding- size = rows - i
            for (int j = 1; j <= rows - i; j++) {
                // 2 spaces - char + space
                System.out.print("  ");
            }

            // print numbers
            for (int j = -i; j <= i; j++) {
                // we want only once 1, and skip print zero
                if (j == 0 || j == 1) {
                    continue;
                }

                // print absolute value
                System.out.print(Math.abs(j) + " ");
            }

            // new row- println same as print("\n");
            System.out.println();
        }
    }

有6行,输出

          1 
        2 1 2 
      3 2 1 2 3 
    4 3 2 1 2 3 4 
  5 4 3 2 1 2 3 4 5 
6 5 4 3 2 1 2 3 4 5 6 

答案 3 :(得分:0)

让我们把它分解成几部分。首先,我们需要弄清楚如何输出金字塔的单个级别。让我们在没有填充的情况下开始。对于第一级,它只是"1",对于其他每个级别,它的高于它的级别被&#34;数字&#34;包围。那个级别(和空格)。

private static String buildLevel(int num) {
    if (num == 1) return "1";

    return Integer.toString(num) + " " + buildLevel(num -1) + " " + Integer.toString(num);
}

然后我们需要能够添加填充,所以让我们创建一个填充到一定长度的方法。

private static String pad(String stringToPad, int padTo) {
    return String.join("", Collections.nCopies(padTo - stringToPad.length(), " ")) + stringToPad;
}

将这些放在一起我们可以通过循环所需的级别并将级别连接在一起来创建一个构建金字塔的方法。

private static String buildPyramid(int height) {
    int expectedLength = height * 2 + 1;

    String out = "";

    for (int i = 1; i <= height; i++) {
        out += pad(buildLevel(i), expectedLength) + "\n";
        expectedLength += 2;
    }

    return out;
}

第一行的长度是height * 2 + 1,通过计算得出。 (这包括每行开头的两个空格,在您的示例中)。每个后续行应比其上一行长2。

这样称呼来生成你的例子

public static void main(String[] args) {
    System.out.println(buildPyramid(5));
}

输出:

          1
        2 1 2
      3 2 1 2 3
    4 3 2 1 2 3 4
  5 4 3 2 1 2 3 4 5

为了完整性,这里是一个块中的所有代码。

private static String buildLevel(int num) {
    if (num == 1) return "1";

    return Integer.toString(num) + " " + buildLevel(num -1) + " " + Integer.toString(num);
}

private static String pad(String stringToPad, int padTo) {
    return String.join("", Collections.nCopies(padTo - stringToPad.length(), " ")) + stringToPad;
}

private static String buildPyramid(int height) {
    int expectedLength = height * 2 + 1;

    String out = "";

    for (int i = 1; i <= height; i++) {
        out += pad(buildLevel(i), expectedLength) + "\n";
        expectedLength += 2;
    }

    return out;
}

public static void main(String[] args) {
    System.out.println(buildPyramid(6));
}