Membuat Segitiga dengan for Loops di Java

1. Perkenalan

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

Secara alami, ada banyak jenis segitiga. Di sini, kita hanya akan menjelajahi beberapa di antaranya: segitiga siku-siku dan sama kaki.

2. Membangun Segitiga Kanan

Segitiga siku-siku adalah jenis segitiga paling sederhana yang akan kita pelajari. Mari kita lihat sekilas keluaran yang ingin kita peroleh:

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

Di sini, kita perhatikan bahwa segitiga terdiri dari 5 baris, masing-masing memiliki jumlah bintang yang sama dengan nomor baris saat ini. Tentu saja, pengamatan 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 total baris.

Jadi, mari kita buat segitiga menggunakan dua for loop:

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. Membangun Segitiga Sama Kaki

Sekarang, mari kita lihat bentuk segitiga sama kaki:

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

Apa yang kita lihat dalam kasus ini? Kami memperhatikan bahwa, selain bintang, kami juga perlu mencetak beberapa spasi untuk setiap baris. Jadi, kita harus mencari tahu berapa banyak ruang dan bintang yang harus kita cetak untuk setiap baris. Tentu saja, jumlah spasi dan bintang bergantung pada baris saat ini.

Pertama, kita melihat bahwa kita perlu mencetak 4 spasi untuk baris pertama dan, saat kita menurunkan segitiga, kita membutuhkan 3 spasi, 2 spasi, 1 spasi, dan tidak ada spasi sama sekali untuk baris terakhir. Generalisasi, kita perlu mencetak spasi N - r untuk setiap baris .

Kedua, membandingkan dengan contoh pertama, kami menyadari bahwa di sini kami membutuhkan jumlah bintang ganjil: 1, 3, 5, 7…

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

3.1. Menggunakan Nested for Loops

Berdasarkan pengamatan di atas, mari buat contoh kedua kita:

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 Single for Loop

Sebenarnya, kami memiliki cara lain yang hanya terdiri dari satu for loop - menggunakan pustaka Apache Commons Lang 3.

Kita akan menggunakan loop for untuk mengulang baris segitiga seperti yang kita lakukan pada contoh sebelumnya. Kemudian, kita akan menggunakan metode StringUtils.repeat () untuk menghasilkan karakter 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 bisa melakukan trik rapi dengan metode substring () .

Kita bisa mengekstrak metode StringUtils.repeat () di atas untuk membuat string pembantu dan kemudian menerapkan metode String.substring () di atasnya. String pembantu adalah rangkaian dari jumlah spasi maksimum dan jumlah bintang maksimum yang kita butuhkan untuk mencetak baris segitiga.

Melihat contoh sebelumnya, kita perhatikan bahwa kita membutuhkan jumlah maksimum N - 1 spasi untuk baris pertama dan jumlah maksimum N x 2 - 1 bintang untuk baris terakhir:

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

Misalnya, ketika N = 5 dan r = 3 , kita perlu mencetak "*****", yang termasuk dalam variabel helperString . Yang perlu kita lakukan adalah menemukan rumus yang tepat untuk metode substring () .

Sekarang, mari kita lihat contoh lengkapnya:

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(); }

Demikian pula, dengan sedikit lebih banyak pekerjaan, kita bisa membuat cetakan segitiga terbalik.

4. Kompleksitas

Jika kita melihat kembali pada contoh pertama, kita melihat loop luar dan loop dalam masing-masing memiliki maksimum N langkah. Oleh karena itu, kami memiliki kompleksitas waktu O (N ^ 2) , di mana N adalah jumlah baris segitiga.

Contoh kedua serupa - satu-satunya perbedaan adalah kita memiliki dua loop dalam, yang berurutan dan tidak menambah kompleksitas waktu.

Contoh ketiga, bagaimanapun, hanya menggunakan loop for dengan N langkah. Tapi, di setiap langkah, kita memanggil metode StringUtils.repeat () atau metode substring () pada helper string, masing-masing memiliki kompleksitas O (N) . Jadi, kompleksitas waktu secara keseluruhan tetap sama.

Akhirnya, jika kita berbicara tentang ruang tambahan, kita dapat dengan cepat menyadari bahwa, untuk semua contoh, kompleksitas tetap ada di variabel StringBuilder . Dengan menambahkan seluruh segitiga ke variabel hasil , kita tidak dapat memiliki kompleksitas kurang dari O (N ^ 2) .

Tentu saja, jika kita mencetak karakter secara langsung, kita akan memiliki kompleksitas ruang yang konstan untuk dua contoh pertama. Tapi, contoh ketiga menggunakan helper string dan kompleksitas ruangnya adalah O (N) .

5. Kesimpulan

Dalam tutorial ini, kita telah belajar bagaimana mencetak dua tipe umum segitiga di Java.

Pertama, kita telah mempelajari segitiga siku-siku, yang merupakan jenis segitiga paling sederhana yang dapat kita cetak di Java. Kemudian, kita telah mempelajari dua cara membuat segitiga sama kaki. Yang pertama hanya menggunakan untuk loop dan yang lainnya memanfaatkan metode StringUtils.repeat () dan metode String.substring () dan membantu kita menulis lebih sedikit kode.

Terakhir, kami telah menganalisis kompleksitas ruang dan waktu untuk setiap contoh.

Seperti biasa, semua contoh dapat ditemukan di GitHub.