Bom dia Leonardo,
Hehehe. Vou tentar explicar então.
Pensei no seguinte: construir a pirâmide debaixo para cima.
Para um dado número de pisos "n", você vai ter na base "2n-1" asteriscos. Ou seja:
- Para n=2 (dois pisos), base vai ter 2n-1=3 asteriscos.
- Para n=3 (três pisos), base vai ter 2n-1=5 asteriscos.
E assim vai. No caso do teu post, são 15 pisos, ou seja, n=15. Logo a base vai ter 2n-1=2*15-1 = 29 asteriscos.
Para construir as linhas de cima, pensei no seguinte: a linha de cima tem sempre dois asteriscos a menos que a linha debaixo. Um retirado da primeira posição, outro da última.
Se você pega n=15, vimos que a base tem 29 asteriscos. A linha anterior (14.ª linha) tem 27 asteriscos (dois a menos). A 13.ª linha tem 2 asteriscos a menos que a 14.ª, ou seja, 25 asteriscos. E assim segue, até a primeira linha.
Deste modo, para detectar onde está o primeiro asterisco a remover da linha debaixo, uso o indexOf e ponho o valor na variável "ini". Para detectar onde está o último, uso o lastIndexOf e ponho o valor em "fim".
Para remover, uso replace, que substitui o asterisco por espaço, nas posições "ini" e "fim" referidas acima.
E, tendo esta nova linha, coloco-a em cima das linhas anteriores com o insert. E concateno com "\n" pra pular linha.
Repito isso até que "ini" == "fim", condição que ocorre ao se chegar à linha do topo, por ela ter só um asterisco.
Ah, a parte do Scanner e do-while é pra ler o número de pisos a partir do teclado do usuário.
Consegui explicar? Rs... Avisa aí se ficou mais claro ou se resta dúvida.
Abraço!