我有一个嵌套循环,打印出一个三角形的数字,如下所示:
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
答案 0 :(得分:0)
我会用以下方式描述你想要做的事情:
n-i-1
数字asc。实现:
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