题解 | #超级圣诞树#
超级圣诞树
https://www.nowcoder.com/practice/470d26c9a73e4e17be8cc45cac843423
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextInt()) { // 注意 while 处理多个 case
int a = in.nextInt();
draw(compose(a),a);
}
}
//递归来获取前一层级的三角图形,使用一个ArrayList<String>来存储图形
public static ArrayList<String> compose(int a) {
ArrayList<String> res = new ArrayList<>();
if (a == 1) {//当层级为1时为初始图形,这里每行后面保留一个空格,这样再花第二层的两个三角型时只要循环就好
StringBuilder line =new StringBuilder(" * ");
res.add(line.toString());
line.delete(0,line.length());
line.append(" * * ");
res.add(line.toString());
line.delete(0,line.length());
line.append("* * * ");
res.add(line.toString());
}else{//每个层级的图形分为两部分,第一部分是空格加上一层级的三角图形;第二部分就是循环两次上一层级的三角图形。第一部分的空格数就是上一层级的图形(带结尾空格)宽度的一半。
ArrayList<String> prev = compose(a-1);
StringBuilder line =new StringBuilder();
for(int i=1;i<=3*Math.pow(2,a-2);i++){
for(int j=1;j<=prev.get(0).length()/2;j++){
line.append(' ');
}
line.append(prev.get(i-1));
for(int j=1;j<=prev.get(0).length()/2;j++){
line.append(' ');
}
res.add(line.toString());
line.delete(0,line.length());
}
for(int i=1;i<=3*Math.pow(2,a-2);i++){
for(int j=1;j<=2;j++){
line.append(prev.get(i-1));
}
res.add(line.toString());
line.delete(0,line.length());
}
}
return res;
}
//按照ArrayList中存储的图形画出圣诞树,需要处理的是:1,图形每行末尾的空格,需要去掉;2,树干,以及树干两边的空格
public static void draw(ArrayList<String> res,int a){
StringBuilder line =new StringBuilder();
for(String s:res){
line.append(s).deleteCharAt(line.length()-1);
System.out.println(line.toString());
line.delete(0,line.length());
}
for(int i=1;i<=a;i++){
for(int j=1;j<res.get(0).length()/2;j++){
System.out.print(" ");
}
System.out.print("*");
for(int j=1;j<res.get(0).length()/2;j++){
System.out.print(" ");
}
System.out.println();
}
}
}
查看20道真题和解析