题解 | 小数字 - 四种方案,逐级推进

小数字

https://www.nowcoder.com/practice/faaaa4ddadb34bae88b37fcb635654f1

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    /**
     * 1. Math.sqrt(n):
     *  1.1 n必需≥0;
     *  1.2 以4为界:n>4时,Math.sqrt(n) 比 n / 2使n变小更多;
     * 2. n / 2:
     *  2.1 以2为界:n>2时,n / 2 比 n - 1使n变小更多;
     *
     * 总结:
     * n≤2,则n-1;n在区间(2,4]的则n/2;n>4,则Math.sqrt(n)
     */

    /**
     * 方案一:
     * 缺点:n-1都要循环一次,性能消耗大且没必要
     */
    // const dataNum = parseInt((await readline()).split(' ')[0])
    // for (let i = 1; i <= dataNum; i++) {
    //     let [n, m] = (await readline()).split(' ').map(x => parseInt(x))
    //     for(let j = m; j >=1; j--) {
    //         n = n > 4 ? Math.ceil(Math.sqrt(n)) :
    //             n > 2 ? Math.ceil(n / 2) : n - 1
    //     }
    //     console.log(n)
    // }

    /**
     * 方案二:
     * 改为:当n≤2,直接减去剩下操作次数,中止循环;
     * 缺点:看别人题解和讨论得知,循环log比一次性log的性能要差
     */
    // const dataNum = parseInt((await readline()).split(' ')[0])
    // for (let i = 1; i <= dataNum; i++) {
    //     let [n, m] = (await readline()).split(' ').map(x => parseInt(x))
    //     for(let j = m; j >=1; j--) {
    //         if (n > 4) n = Math.ceil(Math.sqrt(n))
    //         else if (n > 2) n = Math.ceil(n / 2)
    //         else {
    //             n = n - j
    //             break
    //         }
    //     }
    //     console.log(n)
    // }

    /**
     * 方案三:
     * 改为:一次性log
     */
    // const dataNum = parseInt((await readline()).split(' ')[0])
    // const logArr = []
    // for (let i = 1; i <= dataNum; i++) {
    //     let [n, m] = (await readline()).split(' ').map(x => parseInt(x))
    //     for(let j = m; j >=1; j--) {
    //         if (n > 4) n = Math.ceil(Math.sqrt(n))
    //         else if (n > 2) n = Math.ceil(n / 2)
    //         else {
    //             n = n - j
    //             break
    //         }
    //     }
    //     logArr.push(n)
    // }
    // console.log(logArr.join('\n'))

    /**
     * 方案四:
     * 综合时间和空间,平衡性能
     */
    const dataNum = parseInt((await readline()).split(" ")[0]);
    const logArr = [];
    for (let i = 1; i <= dataNum; i++) {
        let [n, m] = (await readline()).split(" ").map((x) => parseInt(x));
        for (let j = m; j >= 1; j--) {
            if (n > 4) n = Math.ceil(Math.sqrt(n));
            else if (n > 2) n = Math.ceil(n / 2);
            else {
                n = n - j;
                break;
            }
        }
        logArr.push(n)
    }

    const batchSize = 1000; // 批次大小可调整
    for (let i = 0; i < logArr.length; i += batchSize) {
        const batch = logArr.slice(i, i + batchSize);
        console.log(batch.join("\n")); // 每批拼接一次并输出
    }
})();

全部评论

相关推荐

06-12 17:07
沈阳大学 Java
点赞 评论 收藏
分享
LemontreeN:有的兄弟有的我今天一天面了五场,4个二面一个hr面
投递字节跳动等公司7个岗位
点赞 评论 收藏
分享
VirtualBool:都去逗他了?
点赞 评论 收藏
分享
这一集&nbsp;硕士输的很惨
找工作ing10:就是这样不是硕士不愿意脱下长衫,是人家觉得屈才了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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