Membuat Segitiga dengan untuk Gelung di Java

1. Pengenalan

Dalam tutorial ini, kita akan meneroka beberapa cara untuk mencetak segitiga di Java.

Terdapat, secara semula jadi, banyak jenis segitiga. Di sini, kita hanya akan meneroka beberapa daripadanya: segitiga tepat dan isoskel.

2. Membina Segi Tiga Kanan

Segi tiga tepat adalah jenis segitiga termudah yang akan kita kaji. Mari kita lihat dengan cepat output yang ingin kita perolehi:

* ** *** **** *****

Di sini, kita perhatikan bahawa segitiga terbuat dari 5 baris, masing-masing mempunyai bilangan bintang sama dengan nombor baris semasa. Sudah tentu, pemerhatian ini dapat digeneralisasikan: untuk setiap baris dari 1 hingga N , kita harus mencetak r bintang, di mana r adalah baris saat ini dan N adalah jumlah baris.

Oleh itu, mari kita membina segitiga menggunakan dua untuk gelung:

public static String printARightTriangle(int N) { StringBuilder result = new StringBuilder(); for (int r = 1; r <= N; r++) { for (int j = 1; j <= r; j++) { result.append("*"); } result.append(System.lineSeparator()); } return result.toString(); }

3. Membina Segi Tiga Isosceles

Sekarang, mari kita lihat bentuk segitiga isoseles:

 * *** ***** ******* *********

Apa yang kita lihat dalam kes ini? Kami perhatikan bahawa, selain bintang, kami juga perlu mencetak beberapa ruang untuk setiap baris. Oleh itu, kita harus memikirkan berapa banyak ruang dan bintang yang perlu kita cetak untuk setiap baris. Sudah tentu, bilangan ruang dan bintang bergantung pada baris semasa.

Pertama, kita melihat bahawa kita perlu mencetak 4 ruang untuk baris pertama dan, ketika kita turun dari segi tiga, kita memerlukan 3 ruang, 2 ruang, 1 ruang, dan tidak ada ruang sama sekali untuk baris terakhir. Secara umum, kita perlu mencetak ruang N - r untuk setiap baris .

Kedua, jika dibandingkan dengan contoh pertama, kita menyedari bahawa di sini kita memerlukan bilangan bintang yang ganjil: 1, 3, 5, 7…

Jadi, kita perlu mencetak rx 2 - 1 bintang untuk setiap baris .

3.1. Menggunakan Bersarang untuk Gelung

Berdasarkan pemerhatian di atas, mari buat contoh kedua kami:

public static String printAnIsoscelesTriangle(int N) { StringBuilder result = new StringBuilder(); for (int r = 1; r <= N; r++) { for (int sp = 1; sp <= N - r; sp++) { result.append(" "); } for (int c = 1; c <= (r * 2) - 1; c++) { result.append("*"); } result.append(System.lineSeparator()); } return result.toString(); }

3.2. Menggunakan Tunggal untuk Gelung

Sebenarnya, kita mempunyai cara lain yang hanya terdiri daripada satu untuk gelung - ia menggunakan perpustakaan Apache Commons Lang 3.

Kita akan menggunakan gelung untuk mengulangi baris segitiga seperti yang kita lakukan dalam contoh sebelumnya. Kemudian, kami akan menggunakan kaedah StringUtils.repeat () untuk menghasilkan watak yang diperlukan untuk setiap baris:

public static String printAnIsoscelesTriangleUsingStringUtils(int N) { StringBuilder result = new StringBuilder(); for (int r = 1; r <= N; r++) { result.append(StringUtils.repeat(' ', N - r)); result.append(StringUtils.repeat('*', 2 * r - 1)); result.append(System.lineSeparator()); } return result.toString(); }

Atau, kita boleh melakukan silap mata dengan kaedah substring () .

Kita boleh mengekstrak kaedah StringUtils.repeat () di atas untuk membina helper string dan kemudian menerapkan kaedah String.substring () di atasnya. String penolong adalah gabungan bilangan ruang maksimum dan bilangan maksimum bintang yang kami perlukan untuk mencetak baris segitiga.

Melihat contoh sebelumnya, kita perhatikan bahawa kita memerlukan bilangan maksimum N - 1 ruang untuk baris pertama dan bilangan maksimum N x 2 - 1 bintang untuk baris terakhir:

String helperString = StringUtils.repeat(' ', N - 1) + StringUtils.repeat('*', N * 2 - 1); // for N = 10, helperString = " *********"

Sebagai contoh, ketika N = 5 dan r = 3 , kita perlu mencetak "*****", yang termasuk dalam pembolehubah helperString . Yang perlu kita buat hanyalah mencari formula yang tepat untuk kaedah substring () .

Sekarang, mari kita lihat contoh lengkap:

public static String printAnIsoscelesTriangleUsingSubstring(int N) { StringBuilder result = new StringBuilder(); String helperString = StringUtils.repeat(' ', N - 1) + StringUtils.repeat('*', N * 2 - 1); for (int r = 0; r < N; r++) { result.append(helperString.substring(r, N + 2 * r)); result.append(System.lineSeparator()); } return result.toString(); }

Begitu juga, dengan sedikit kerja lagi, kita dapat membuat cetakan segitiga terbalik.

4. Kerumitan

Sekiranya kita melihat kembali contoh pertama, kita melihat gelung luar dan gelung dalam masing-masing mempunyai maksimum langkah N. Oleh itu, kita mempunyai kerumitan masa O (N ^ 2) , di mana N adalah bilangan baris segitiga.

Contoh kedua serupa - satu-satunya perbezaan ialah kita mempunyai dua gelung dalaman, yang berurutan dan tidak meningkatkan kerumitan masa.

Contoh ketiga, bagaimanapun, hanya menggunakan gelung untuk langkah dengan langkah N. Tetapi, pada setiap langkah, kita memanggil kaedah StringUtils.repeat () atau kaedah substring () pada tali helper, masing-masing mempunyai kerumitan O (N) . Jadi, kerumitan masa secara keseluruhan tetap sama.

Akhirnya, jika kita bercakap mengenai ruang tambahan, kita dapat dengan cepat menyedari bahawa, untuk semua contoh, kerumitan tetap ada dalam pemboleh ubah StringBuilder . Dengan menambahkan keseluruhan segitiga ke pemboleh ubah hasil , kita tidak boleh mempunyai kerumitan kurang dari O (N ^ 2) .

Sudah tentu, jika kita mencetak watak secara langsung, kita mempunyai kerumitan ruang yang tetap untuk dua contoh pertama. Tetapi, contoh ketiga menggunakan tali helper dan kerumitan ruang adalah O (N) .

5. Kesimpulan

Dalam tutorial ini, kami telah belajar bagaimana mencetak dua jenis segitiga umum di Jawa.

Pertama, kami telah mengkaji segitiga yang betul, yang merupakan jenis segitiga termudah yang dapat kami cetak di Jawa. Kemudian, kami telah meneroka dua cara untuk membina segitiga isoseles. Yang pertama hanya digunakan untuk gelung dan yang lain memanfaatkan kaedah StringUtils.repeat () dan String.substring () dan membantu kita menulis lebih sedikit kod.

Akhirnya, kami telah menganalisis kerumitan masa dan ruang untuk setiap contoh.

Seperti biasa, semua contoh boleh didapati di GitHub.