Pintia题解——7-10 打印沙漏

7-10 打印沙漏

原题:

本题要求你写个程序把给定的符号打印成沙漏的形状。例如给定17个“*”,要求按下列格式打印

*****
 ***
  *
 ***
*****

所谓“沙漏形状”,是指每行输出奇数个符号;各行符号中心对齐;相邻两行符号数差2;符号数先从大到小顺序递减到1,再从小到大顺序递增;首尾符号数相等。

给定任意N个符号,不一定能正好组成一个沙漏。要求打印出的沙漏能用掉尽可能多的符号。

输入格式:

输入在一行给出1个正整数N(≤1000)和一个符号,中间以空格分隔。

输出格式:

首先打印出由给定符号组成的最大的沙漏形状,最后在一行中输出剩下没用掉的符号数。

.

解题思路:

  1. 引入readline模块并创建接口对象:首先将readline模块引入,并使用createInterface方法创建一个接口对象rl。该对象设置了输入流为标准输入。
  2. 读取输入并存储:通过监听'line'事件,将每行输入存储在数组buf中。
  3. 解析输入:通过buf[0].split(" ")分割第一行输入文本,得到菱形边长n和填充字符c。
  4. 计算菱形变长:通过公式m = Math.floor(Math.sqrt((parseInt(n) + 1) / 2))计算出菱形边长的一半m。
  5. 输出菱形图案:使用两个嵌套的循环遍历菱形区域的每个位置,使用判断条件判断当前位置是否应该填入字符c,并将结果存储在字符串row中。最后通过console.log方法输出菱形图案。
  6. 输出数字:通过公式parseInt(n) - 2 * m * m + 1计算出应该输出的数字,并将其输出到控制台。

.

JavaScript(node)代码:

const r = require("readline");
const rl = r.createInterface({
    input: process.stdin
});
let buf = [];
rl.on('line', (input) => buf.push(input));
rl.on('close', () => {
    let text = buf[0].split(" ")
    const n = text[0];
    const c = text[1];

    const m = Math.floor(Math.sqrt((parseInt(n) + 1) / 2));

    for (let i = 0; i < 2 * m - 1; i++) {
        let row = '';
        for (let j = 0; j < 2 * m - 1; j++) {
            if ((i > j && i + j < 2 * m - 2) || (i < j && i + j > 2 * m - 2)) {
                if (i > j && i + j < 2 * m - 2) {
                    row += ' ';
                }
            } else {
                row += c;
            }
        }
        console.log(row);
    }

    console.log(parseInt(n) - 2 * m * m + 1);
});

.

复杂度分析:

时间复杂度:O(2n)
空间复杂度:O(n)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mredust

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值