有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何反转直角三角形(Java)

我有一个嵌套循环,它打印一个三角形的数字,如下所示:

123
12
1

我需要另一个三角形,但它必须倒过来,这样两个三角形才能在下面形成一个空三角形,就像这样:

12321
12 21
1   1

这是我的第一个循环:

for (i = n; i >= 1; i--) {
    System.out.println();
    for (j = 1; j <= i; j++) {
        System.out.print(j);
    }
}
System.out.println();

我添加了另一个循环:

for (j = n; j >= 1; j--) {
    System.out.print(j); 
}

现在数字颠倒了,但重复了,就像这样:

123321
12321
1321

共 (4) 个答案

  1. # 1 楼答案

    这是一个稍微“聪明”一点的解决方案:

    for (int i = 3; i >= 1; i--) {
        for (int j = -2; j <= 2; j++) {
            final int toPrint = 3 - Math.abs(j);
            System.out.print(toPrint <= i ? Integer.toString(toPrint) : " ");
        }
        System.out.println();
    }
    

    它使用abs,因此它可以对1-2-3-2-1序列使用单个内部循环,并通过与行号进行比较来决定是否打印数字或空格

  2. # 2 楼答案

    我将用以下方式描述您想要做的事情:

    1. 打印n-i-1编号asc
    2. 打印一个空格
    3. 如果i==0,则打印n,否则打印空间
    4. 打印n-i-1数字说明

    实施:

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n-i-1; j++) {
            System.out.print(j+1);
        }
        for (int j = 0; j < i; j++) {
            System.out.print(" ");
        }
        System.out.print(i == 0 ? n : " ");
        for (int k = n-i-1; k > 0; k--) {
            System.out.print(k);
        }
        System.out.println();
    }
    
  3. # 3 楼答案

    这是我的解决方案:

    int n = 3;
    for (int i = n; i >= 1; i--) {
        System.out.println();
        for (int j = n - 1; j > -n; j--) {
            int k = n - Math.abs(j);
            if (k <= i) {
                System.out.print(k);
            } else {
                System.out.print(" ");
            }
        }
    }
    System.out.println();
    

    它是如何工作的?让我们简化代码:

    int n = 3;
    for (int i = n; i >= 1; i--) {
        System.out.println();
        for (int j = n - 1; j > -n; j--) {
            int k = n - Math.abs(j);
            System.out.print(k);
        }
    }
    System.out.println();
    

    我们只需打印矩形:

    12321
    12321
    12321
    

    现在,对于每一行,我们需要打印k<;=我

    int n = 3;
    for (int i = n; i >= 1; i--) {
        System.out.println();
        for (int j = n - 1; j > -n; j--) {
            int k = n - Math.abs(j);
            if (k <= i) {
                System.out.print(k);
            } else {
                System.out.print(" ");
            }
        }
    }
    System.out.println();
    

    并且:

    12321
    12 21
    1   1
    
  4. # 4 楼答案

    下面是一个使用单个char[]的精简优化版本:

    private static void printHollowTriangle(int size) {
        char[] buf = new char[size * 2 - 1];
        for (int i = 0, j = buf.length - 1; i <= j; i++, j--)
            buf[i] = buf[j] = Character.forDigit(i + 1, Character.MAX_RADIX);
        for (int i = size - 1, j = size - 1; i >= 0; i--, j++) {
            System.out.println(buf);
            buf[i] = buf[j] = ' ';
        }
    }
    

    它可以打印大小为1到35的有效三角形。见最后的例子

    逻辑是这样的:

    • 所有行的长度都相同,因此可以使用一个大小合适的char[]

    • >P>第一条线是通过从开始的“EM”和“EEM”从最后开始分配递增数,直到它们在中间相遇为止。中间的字符是双重赋值的,但是添加if语句来跳过它只会使代码复杂化,没有任何好处

      递增的一位数是在base-36中完成的,因此它可以处理大小不超过35的三角形

      从技术上讲,代码应该为size值抛出IllegalArgumentException,超出支持的范围1-35

    • 打印第一行的所有数字

    • 所有后续行与前一行基本相同,只是中间空白区域的大小有所增加,所以每次迭代只需再清空两个字符。第一次迭代将再次双重分配,但没有问题,就像以前一样

    • 为了保存print语句,打印实际上是在循环开始时完成的,因此最后一次迭代将生成一个完全空白的行,但不会打印

    正如承诺的那样,以下是示例输出:

    printHollowTriangle(1);

    1
    

    printHollowTriangle(2);

    121
    1 1
    

    printHollowTriangle(3);

    12321
    12 21
    1   1
    

    printHollowTriangle(35);

    123456789abcdefghijklmnopqrstuvwxyzyxwvutsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrstuvwxy yxwvutsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrstuvwx   xwvutsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrstuvw     wvutsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrstuv       vutsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrstu         utsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrst           tsrqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqrs             srqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopqr               rqponmlkjihgfedcba987654321
    123456789abcdefghijklmnopq                 qponmlkjihgfedcba987654321
    123456789abcdefghijklmnop                   ponmlkjihgfedcba987654321
    123456789abcdefghijklmno                     onmlkjihgfedcba987654321
    123456789abcdefghijklmn                       nmlkjihgfedcba987654321
    123456789abcdefghijklm                         mlkjihgfedcba987654321
    123456789abcdefghijkl                           lkjihgfedcba987654321
    123456789abcdefghijk                             kjihgfedcba987654321
    123456789abcdefghij                               jihgfedcba987654321
    123456789abcdefghi                                 ihgfedcba987654321
    123456789abcdefgh                                   hgfedcba987654321
    123456789abcdefg                                     gfedcba987654321
    123456789abcdef                                       fedcba987654321
    123456789abcde                                         edcba987654321
    123456789abcd                                           dcba987654321
    123456789abc                                             cba987654321
    123456789ab                                               ba987654321
    123456789a                                                 a987654321
    123456789                                                   987654321
    12345678                                                     87654321
    1234567                                                       7654321
    123456                                                         654321
    12345                                                           54321
    1234                                                             4321
    123                                                               321
    12                                                                 21
    1                                                                   1