2016-11-15 223 views
1

我有一個嵌套的循環,打印數字,像這樣一個三角形:如何反轉直角三角形(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 
+1

它可以很容易但恕我直言,我會建議您嘗試多一點 –

+1

提示:您所需要的內部循環中更多的條件和邏輯。 (把「j」「減」到「1」) –

+0

@ cricket_007我需要考慮間距嗎? – cosmo

回答

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 

而現在,每i個行,我們需要打印的編號中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 
+0

你能解釋你的邏輯嗎?你的思維過程? – cosmo

+0

我如何看待邏輯似乎與邏輯@Marko Topolnik。 –

0

我會形容你想通過以下方式做的:

  1. 打印n-i-1數字asc。
  2. print i spaces。
  3. if i == 0 print n,else print space。
  4. 打印NI-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(); 
} 
0

這是一個稍微 「更聰明」 的解決方案:

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序列,並決定是否通過比較行號來打印數字或空格。

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語句跳過,只會使代碼複雜化,沒有任何好處。

    的遞增單位數字在基地-36完成的,因此它可以處理的三角形高達35大小

    的代碼應當在技術上扔1-35支持的範圍以外IllegalArgumentExceptionsize值。

  • 用所有數字打印第一行。

  • 除了中心空白區域的大小增加之外,所有後續行大部分與前一行相同,因此每次迭代時只需簡單地刪除兩個字符。第一次迭代將再次雙重分配,但沒有問題,像以前一樣。

  • 要保存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