题解 | #超级圣诞树#

超级圣诞树

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

        }

    }
}

全部评论

相关推荐

萧索X:写篮球联赛干嘛,陪老板打篮球吗。还有实习经历要写自己所在岗位具体完成什么工作,自己的任务具体完成了什么需求,给公司带来了哪些量化增长
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务