Criando um triângulo com loops para Java
1. Introdução
Neste tutorial, vamos explorar várias maneiras de imprimir um triângulo em Java.
Existem, naturalmente, muitos tipos de triângulos. Aqui,we’re going to explore only a couple of them: right and isosceles triangles.
2. Construindo um triângulo retângulo
O triângulo retângulo é o tipo mais simples de triângulo que vamos estudar. Vamos dar uma olhada rápida na saída que queremos obter:
*
**
***
****
*****
Aqui, notamos que o triângulo é composto por 5 linhas, cada uma com um número de estrelas igual ao número da linha atual. Claro, esta observação pode ser generalizada:for each row from 1 to N, we have to print r stars, where r is the current row and N is the total number of rows.
Então, vamos construir o triângulo usando dois loopsfor:
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. Construindo um triângulo isósceles
Agora, vamos dar uma olhada na forma de um triângulo isósceles:
*
***
*****
*******
*********
O que vemos neste caso? Notamos que,in addition to the stars, we also need to print some spaces for each row. Então, temos que descobrir quantos espaços e estrelas temos que imprimir para cada linha. Obviamente, o número de espaços e estrelas depende da linha atual.
Primeiro, vemos que precisamos imprimir 4 espaços para a primeira linha e, ao descermos o triângulo, precisamos de 3 espaços, 2 espaços, 1 espaço e nenhum espaço para a última linha. Generalizing, we need to print N – r spaces for each row.
Segundo, comparando com o primeiro exemplo, percebemos que aqui precisamos de um número ímpar de estrelas: 1, 3, 5, 7…
Portanto,we need to print r x 2 – 1 stars for each row.
3.1. Usando Loopsfor Aninhados
Com base nas observações acima, vamos criar nosso segundo exemplo:
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. Usando um único loop defor
Na verdade, temos outra maneira que consists only of a single for loop – it uses the Apache Commons Lang 3 library.
Vamos usar o loop for para iterar sobre as linhas do triângulo, como fizemos nos exemplos anteriores. Então, vamos usar o métodoStringUtils.repeat() para gerar os caracteres necessários para cada linha:
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();
}
Ou podemos fazer um truque bacana comthe substring() method.
Podemos extrair os métodosStringUtils.repeat() acima para construir uma string auxiliar e então aplicar o métodoString.substring() nela. The helper string is a concatenation of the maximum number of spaces and the maximum number of stars that we need to print the rows of the triangle.
Olhando para os exemplos anteriores, notamos que precisamos de um número máximo deN – 1 espaços para a primeira linha e um número máximo deN x 2 – 1 estrelas para a última linha:
String helperString = StringUtils.repeat(' ', N - 1) + StringUtils.repeat('*', N * 2 - 1);
// for N = 10, helperString = " *********"
Por exemplo, quandoN = 5er = 3, precisamos imprimir ”*”, que está incluído na variávelhelperString. Tudo o que precisamos fazer é encontrar a fórmula certa para o métodosubstring().
Agora, vamos ver o exemplo completo:
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();
}
Da mesma forma, com um pouco mais de trabalho, poderíamos imprimir o triângulo de cabeça para baixo.
4. Complexidade
Se dermos uma olhada novamente no primeiro exemplo, notamos um loop externo e um loop interno, cada um tendo no máximoN passos. Therefore, we have O(N^2) time complexity, where N is the number of rows of the triangle.
O segundo exemplo é semelhante - a única diferença é que temos dois loops internos, que são seqüenciais e não aumentam a complexidade do tempo.
O terceiro exemplo, entretanto, usa apenas um loopfor com etapasN. Mas, a cada etapa, estamos chamando o métodoStringUtils.repeat() ou o métodosubstring() na string auxiliar, cada um com complexidade deO(N). Portanto, a complexidade geral do tempo permanece a mesma.
Finalmente, se estamos falando sobre o espaço auxiliar, podemos perceber rapidamente que, para todos os exemplos, a complexidade permanece na variávelStringBuilder. By adding the entire triangle to the result variable, we cannot have less than O(N^2) complexity.
Claro, se imprimirmos diretamente os caracteres, teríamos complexidade de espaço constante para os primeiros dois exemplos. Mas, o terceiro exemplo usa a string auxiliar e a complexidade do espaço seriaO(N).
5. Conclusão
Neste tutorial, aprendemos como imprimir dois tipos comuns de triângulos em Java.
Primeiro,we’ve studied the right triangle, which is the simplest type of triangle we can print in Java. Depois,we’ve explored two ways of building an isosceles triangle. O primeiro usa apenasfor loops e o outro aproveita os métodosStringUtils.repeat()eString.substring() e nos ajuda a escrever menos código.
Finalmente, analisamos a complexidade de tempo e espaço para cada exemplo.
Como sempre, todos os exemplos podem ser encontradosover on GitHub.