【Java】pat乙级_1027满分及测试点2

题目就不给了,大家都有

一、测试点2

        这个测试点我找了很久时间,也找了很多博客,都没找到,因为我以为当 n<7的时候,存在两种情况

// 第一种
*

// 第二种
***
 *

        这在我的理解中,才是真的符合题目的那句 “不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号” ,没想到就是这个理解,让我debug了半个小时!当发现真相的我简直哭笑不得!

        当n小于7的时候只有一种情况,就是

*

对,你没看错,就是一个 “ * ”,可能这才是符合题目的沙漏形状吧,是我想多了……

所以想通过测试点2,就加个判断,当 n < 7 的时候,只会打印出一个Symbol,当然,没使用到的符号数也要打印出来

二、附上我自己的代码

比较冗余,没有去进行优化,主要是我第一遍写的时候,就只剩下测试点2没通过了,而找通过测试点2的方法又找了很久,心累  :( 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @ClassName Main_1027
 * @Description TODO 打印沙漏
 * @date 2021/8/28 11:15
 * @Author ZY
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] messages = br.readLine().split("\\s+");
        br.close();
        int total = Integer.parseInt(messages[0]);  // 给的符号总数
        String symbol = messages[1];    // 给的符号

        if (total<7){
            System.out.println(symbol);
            System.out.println(total-1);
            return;
        }

        // 计算到底有几层——先不考虑只有一层的情况以及没有的情况
        int lines = 1;
        while (true){
            int nowSymbol = 2*lines*lines + 4*lines;
            if (nowSymbol > total-1){
                lines--;
                break;
            }
            if (nowSymbol == total-1){
                break;
            }
            lines++;
        }
        // 这就得到了最大的层数lines
        // 还要考虑以下情况
        // 1.加上最中间的1是否超过总数,若超过lines-1
        if (2*lines*lines + 4*lines +1 > total){
            lines--;
        }
        int upLines = lines;
        int downLines = lines;
        // 2.如果剩下的还能让上面或者下面多一行,则上面的多加一行
        boolean flag = false;
        if (total-(2*lines*lines + 4*lines)-1 >= 2*(lines+1)+1){
            flag = true;
            upLines++;
        }


        // 打印沙漏
        upShape(upLines,symbol);
        if (flag){
            System.out.print(" ");
        }
        for (int i = 0; i < lines; i++) {
            System.out.print(" ");
        }
        System.out.println(symbol);
        downShape(downLines,symbol,flag);

        // 输出还剩下的
        if (upLines == downLines){
            System.out.println(total - (2*lines*lines + 4*lines +1));
        }else{
            System.out.println(total - (2*lines*lines + 4*lines +1)-(2*(lines+1)+1));
        }
    }

    // 上半截
    private static void upShape(int upLines,String symbol) {
        for (int i = upLines;i>0;i--){
            // 输出空格
            for (int j = 0;j<upLines-i;j++){
                System.out.print(" ");
            }
            //输出符号
            for (int j = 0; j < 2 * i + 1; j++) {
                System.out.print(symbol);
            }
            System.out.println();
        }
    }

    // 下半截
    private static void downShape(int downLines,String symbol,boolean flag) {
        if (flag){
            for (int i = 1;i<=downLines;i++){
                System.out.print(" ");
                //输出空格
                for (int j = i; j < downLines; j++) {
                    System.out.print(" ");
                }
                // 输出符号
                for(int j = 0;j<(2*i+1);j++ ){
                    System.out.print(symbol);
                }
                System.out.println();
            }
        }else {
            for (int i = 1;i<=downLines;i++){
                //输出空格
                for (int j = i; j < downLines; j++) {
                    System.out.print(" ");
                }
                // 输出符号
                for(int j = 0;j<(2*i+1);j++ ){
                    System.out.print(symbol);
                }
                System.out.println();
            }
        }
    }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值