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

时间:2016-11-15 16:56:29

标签: 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 个答案:

答案 0 :(得分:0)

我会用以下方式描述你想要做的事情:

  1. 打印n-i-1数字asc。
  2. 打印我的空格。
  3. if i == 0 print n,else print space。
  4. print n-i-1 numbers desc
  5. 实现:

    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();
    }
    

答案 1 :(得分:0)

这是一个稍微聪明的&#34;溶液:

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 :(得分:0)

这是我的解决方案:

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 <= i。

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

答案 3 :(得分:0)

以下是使用单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[]个。

  • 第一行是通过从开头开始分配递增数字来构建的,直到它们在中间相遇。中间字符是双重分配的,但添加if语句要跳过,只会使代码复杂化而无益处。

    递增的单位数字在base-36中完成,因此它可以处理最大为35的三角形。

    代码在技术上应该IllegalArgumentException使size值超出支持的范围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