我正在练习基本的编码练习并尝试在Java中打印以下三角形:
*
***
*****
***
*
以下代码给出了结果,但我觉得必须有一个更优雅的解决方案
for (int i = 1; i <= 5; i++) {
if (i % 2 == 1) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println("");
}
}
for (int i = 3; i > 0; i--) {
if (i % 2 == 1) {
for (int j = 1; j < i + 1; j++) {
System.out.print("*");
}
System.out.println("");
}
}
任何人都可以提供一些有关如何更好地完成这项工作的见解吗?
好的,这里有一些产生正确结果的代码只使用了两个for循环,但它看起来更加丑陋:
for (int i = 1; i <= 10; i += 2) {
if (i <= 5) {
for (int j = 1; j <= i; j++) {
System.out.print("*");
}
System.out.println("");
}
else if(i > 5 && i < 8){
for(int j = i/2; j > 0; j--){
System.out.print("*");
}
System.out.println("");
}
else{
for(int j = 1; j > 0; j--){
System.out.print("*");
}
System.out.println("");
}
}
答案 0 :(得分:2)
首先,您正在跳过循环的每个第二次迭代,因为您希望一次增加两个步骤。您可以通过将循环中的“i ++”更改为“i + = 2”并将“i--”更改为“i - = 2”来实现此目的,这将具有相同的效果并允许您删除两个循环中的if
另一个改进是使用单个外环并确定内环是应该增加还是减少星号的数量。也许你可以想出一个方程式,根据i的值给出你的星号数量? (我不想完全解决它,所以你还剩下一些练习,如果你想要一个完整的解决方案,请发表评论)
更新了一个可能被认为优雅的解决方案,因为您可以更改三角形的高度并且不会重复:
int height = 5;
for (int i = 1; i <= 2 * height; i += 2) {
int numAsterisks;
if (i <= height) {
numAsterisks = i;
} else {
numAsterisks = 2 * height - i;
}
for (int j = 0; j < numAsterisks; j++) {
System.out.print("*");
}
System.out.println();
}
答案 1 :(得分:1)
以下情况如何?
public void printTriangle(int size) {
int half = size / 2;
for (int i = 0; i < size; i++) {
int stars = 1 + 2 * (i <= half ? i : size - 1 - i);
char[] a = new char[stars];
Arrays.fill(a, '*');
System.out.println(new String(a));
}
}
或者只是稍微优化一下:
public void printTriangle(int size) {
int half = size / 2;
char[] a = new char[size];
Arrays.fill(a, '*');
for (int i = 0; i < size; i++) {
int stars = 1 + 2 * (i <= half ? i : size - 1 - i);
System.out.println(new String(a, 0, stars));
}
}
答案 2 :(得分:0)
for(int i = 0; i < 7; i++) {
for(int j = 0; j < i; j++) {
print("*");
}
print("\n");
}
这可以是打印常规直角三角形的另一种解决方案......
答案 3 :(得分:0)
这是查看问题的另一种方式。通过使用整数数组,我可以通过更改数组中的值来解决许多形状绘制问题。
在解决更难的问题时,您将使用模型类而不是简单的整数。然而,这个想法是一样的。
这是输出。
*
***
*****
***
*
这是代码:
public class Triangle {
public static void main(String[] args) {
int[] heights = {1, 3, 5, 3, 1};
for (int i = 0; i < heights.length; i++) {
for (int j = 0; j < heights[i]; j++) {
System.out.print("*");
}
System.out.println("");
}
}
}
答案 4 :(得分:-1)
怎么样......
int width = 5;
for (int i = 1; i <= width; i+=2){
System.out.println(String.format("%"+i+"s", "").replaceAll(" ", "*"));
}
for (int i = width-2; i > 0; i-=2){
System.out.println(String.format("%"+i+"s", "").replaceAll(" ", "*"));
}
或者,甚至更好......
int width = 7;
double half = width / 2
for (int i = 0; i < width; i++){
System.out.println(String.format("%"+((i < half ? i : (width-i-1))*2+1)+"s", "").replaceAll(" ", "*"));
}
给出
*
***
*****
***
*