代碼一樣,就是如果你寫一個可重用的helper方法重複代碼編寫要容易得多。
這就是所謂的幹原理(Don't Repeat Yourself)。
在這種情況下,您希望爲箭頭打印'*'
的重複字符,併爲縮進重複' '
(空格)的字符。因此,寫一個方法用於創建重複字符的String
:
private static String repeat(char ch, int count) {
char[] buf = new char[count];
Arrays.fill(buf, ch);
return new String(buf);
}
現在你已經是,打印右箭頭突然輕鬆了不少:
private static void printRightArrow(char ch, int n) {
for (int i = 1; i < n; i++)
System.out.println(repeat(' ', n - 1) + repeat(ch, i));
System.out.println(repeat(ch, n * 2 - 1));
for (int i = n - 1; i >= 1; i--)
System.out.println(repeat(' ', n - 1) + repeat(ch, i));
}
測試和輸出
printRightArrow('*', 3);
printRightArrow('#', 7);
*
**
*****
**
*
#
##
###
####
#####
######
#############
######
#####
####
###
##
#
在另一個方向上印刷箭頭非常相似:
private static void printLeftArrow(char ch, int n) {
for (int i = 1; i < n; i++)
System.out.println(repeat(' ', n - i) + repeat(ch, i));
System.out.println(repeat(ch, n * 2 - 1));
for (int i = n - 1; i >= 1; i--)
System.out.println(repeat(' ', n - i) + repeat(ch, i));
}
private static void printUpArrow(char ch, int n) {
for (int i = 1; i <= n; i++)
System.out.println(repeat(' ', n - i) + repeat(ch, i * 2 - 1));
for (int i = 1; i < n; i++)
System.out.println(repeat(' ', n - 1) + ch);
}
private static void printDownArrow(char ch, int n) {
for (int i = 1; i < n; i++)
System.out.println(repeat(' ', n - 1) + ch);
for (int i = n; i >= 1; i--)
System.out.println(repeat(' ', n - i) + repeat(ch, i * 2 - 1));
}
測試和輸出
printRightArrow('*', 5);
printLeftArrow('*', 5);
printUpArrow('*', 5);
printDownArrow('*', 5);
*
**
***
****
*********
****
***
**
*
*
**
***
****
*********
****
***
**
*
*
***
*****
*******
*********
*
*
*
*
*
*
*
*
*********
*******
*****
***
*
在r = 3以外的行上,使用適當數量的空格開始行。在r = 3行,用許多星號開始。試着將問題分解爲基本要素,希望你會發現每一個要素都是可行的。 – yshavit
我說,不要爲你的第一個for循環輸出println,而只是輸出。然後在打印後加一個if-else,如果'x = n1'則輸出'n1 - 1'更多的星號,然後移動到新的一行,否則就移動到一個新的行。 – skwear
對不起,忘了空格。我稍後會發布解決方案,但這個想法是一樣的。這可能實際上是Code Golf SE的東西:) – skwear