Erstellen eines Dreiecks mit for-Schleifen in Java

1. Einleitung

In diesem Tutorial werden verschiedene Möglichkeiten zum Drucken eines Dreiecks in Java untersucht.

Es gibt natürlich viele Arten von Dreiecken. Hier werden wir nur einige davon untersuchen: rechte und gleichschenklige Dreiecke.

2. Ein rechtes Dreieck bauen

Das rechte Dreieck ist die einfachste Art von Dreieck, die wir untersuchen werden. Lassen Sie uns einen kurzen Blick auf die Ausgabe werfen, die wir erhalten möchten:

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

Hier stellen wir fest, dass das Dreieck aus 5 Zeilen besteht, von denen jede eine Anzahl von Sternen aufweist, die der aktuellen Zeilennummer entspricht. Natürlich kann diese Beobachtung verallgemeinert werden: Für jede Zeile von 1 bis N müssen r Sterne gedruckt werden, wobei r die aktuelle Zeile und N die Gesamtzahl der Zeilen ist.

Erstellen wir also das Dreieck mit zwei for- Schleifen:

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. Aufbau eines gleichschenkligen Dreiecks

Schauen wir uns nun die Form eines gleichschenkligen Dreiecks an:

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

Was sehen wir in diesem Fall? Wir stellen fest, dass wir zusätzlich zu den Sternen auch einige Leerzeichen für jede Zeile drucken müssen. Wir müssen also herausfinden, wie viele Leerzeichen und Sterne wir für jede Zeile drucken müssen. Die Anzahl der Leerzeichen und Sterne hängt natürlich von der aktuellen Zeile ab.

Zuerst sehen wir, dass wir 4 Leerzeichen für die erste Zeile drucken müssen, und wenn wir das Dreieck herunterkommen, benötigen wir 3 Leerzeichen, 2 Leerzeichen, 1 Leerzeichen und überhaupt keine Leerzeichen für die letzte Zeile. Verallgemeinernd müssen wir für jede Zeile N - r Leerzeichen drucken .

Zweitens stellen wir im Vergleich zum ersten Beispiel fest, dass wir hier eine ungerade Anzahl von Sternen benötigen: 1, 3, 5, 7…

Also müssen wir drucken rx 2 - 1 für jede Zeile Sternen .

3.1. Verwenden von Nested for Loops

Lassen Sie uns basierend auf den obigen Beobachtungen unser zweites Beispiel erstellen:

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. Verwenden einer Single für die Schleife

Tatsächlich haben wir einen anderen Weg, der nur aus einer einzelnen for- Schleife besteht - sie verwendet die Apache Commons Lang 3-Bibliothek.

Wir werden die for-Schleife verwenden, um über die Zeilen des Dreiecks zu iterieren, wie wir es in den vorherigen Beispielen getan haben. Dann verwenden wir die StringUtils.repeat () -Methode, um die erforderlichen Zeichen für jede Zeile zu generieren:

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

Oder wir können einen ordentlichen Trick mit der substring () -Methode machen.

Wir können die obigen StringUtils.repeat () -Methoden extrahieren , um einen Hilfsstring zu erstellen, und dann die String.substring () -Methode darauf anwenden . Die Hilfszeichenfolge ist eine Verkettung der maximalen Anzahl von Leerzeichen und der maximalen Anzahl von Sternen, die zum Drucken der Zeilen des Dreiecks erforderlich sind.

Bei Betrachtung der vorherigen Beispiele stellen wir fest, dass wir eine maximale Anzahl von N - 1 Leerzeichen für die erste Reihe und eine maximale Anzahl von N x 2 - 1 Sternen für die letzte Reihe benötigen :

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

Wenn beispielsweise N = 5 und r = 3 ist , müssen wir "*****" drucken, das in der Variablen helperString enthalten ist. Wir müssen lediglich die richtige Formel für die Methode substring () finden .

Schauen wir uns nun das vollständige Beispiel an:

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

In ähnlicher Weise könnten wir mit etwas mehr Arbeit den Dreiecksdruck auf den Kopf stellen.

4. Komplexität

Wenn wir uns das erste Beispiel noch einmal ansehen, bemerken wir eine äußere und eine innere Schleife mit jeweils maximal N Schritten. Daher haben wir eine zeitliche Komplexität von O (N ^ 2) , wobei N die Anzahl der Zeilen des Dreiecks ist.

Das zweite Beispiel ist ähnlich - der einzige Unterschied besteht darin, dass wir zwei innere Schleifen haben, die sequentiell sind und die zeitliche Komplexität nicht erhöhen.

Das dritte Beispiel verwendet jedoch nur eine for- Schleife mit N Schritten. Aber bei jedem Schritt, ich rufen wir entweder die StringUtils.repeat () -Methode oder die substring () Methode auf dem Helfer Zeichenfolge, die jeweils mit O (N) Komplexität. Die Gesamtzeitkomplexität bleibt also gleich.

Wenn wir schließlich über den Hilfsraum sprechen, können wir schnell erkennen, dass bei allen Beispielen die Komplexität in der StringBuilder- Variablen bleibt . Durch Hinzufügen des gesamten Dreiecks zur Ergebnisvariablen können wir nicht weniger als O (N ^ 2) Komplexität haben.

Wenn wir die Zeichen direkt drucken würden, hätten wir natürlich eine konstante Raumkomplexität für die ersten beiden Beispiele. Im dritten Beispiel wird jedoch die Hilfszeichenfolge verwendet, und die Raumkomplexität wäre O (N) .

5. Schlussfolgerung

In diesem Tutorial haben wir gelernt, wie zwei gängige Arten von Dreiecken in Java gedruckt werden.

Zuerst haben wir das rechte Dreieck untersucht, das der einfachste Dreieckstyp ist, den wir in Java drucken können. Anschließend haben wir zwei Möglichkeiten zum Erstellen eines gleichschenkligen Dreiecks untersucht. Die erste Methode verwendet nur for- Schleifen und die andere nutzt die Methoden StringUtils.repeat () und String.substring () und hilft uns, weniger Code zu schreiben.

Schließlich haben wir die zeitliche und räumliche Komplexität für jedes Beispiel analysiert.

Wie immer finden Sie alle Beispiele auf GitHub.