题解 | 小数字 - 四种方案,逐级推进
小数字
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")); // 每批拼接一次并输出 } })();