Node.js读取stdin处理HackerEarth Monk and rotation题提交失败求助
问题排查与修复方案
存在的核心问题
- 多余输出:旋转步数模为0时,额外调用了
console.log输出结果,最终main函数又会输出一次,导致重复输出不符合判题要求 - 类型未转换:数组长度、旋转步数都是字符串类型,未显式转为数字,极端场景下会出现隐式转换错误
- 空行/多余字符兼容差:未对每行做首尾去空处理,输入末尾空行、行首行尾空格都会导致解析错误
- 循环逻辑冗余:遍历步长固定为1,处理完测试用例的参数行后,下一轮会遍历无意义的数组行,浪费性能且有概率触发异常
- 测试用例数未使用:读取了首行的测试用例总数但未用于循环控制,输入结构异常时会出现多余处理
修复后的代码
process.stdin.resume(); process.stdin.setEncoding("utf-8"); var stdin_input = ""; process.stdin.on("data", function (input) { stdin_input += input; }); process.stdin.on("end", function () { // 预处理输入:过滤空行、每行首尾去空 let lines = stdin_input.split('\n').map(line => line.trim()).filter(line => line.length > 0); let inputArr = []; // 首行转数字作为测试用例总数 const numberTestCase = parseInt(lines[0]); let i = 1; for (let caseIdx = 0; caseIdx < numberTestCase; caseIdx++) { // 读取当前测试用例的参数,显式转数字 let [noOfElement, stepRotation] = lines[i].split(/\s+/).map(Number); i++; // 读取数组行 let arrayData = lines[i].split(/\s+/); i++; // 计算实际旋转偏移 let mod = stepRotation % noOfElement; if (mod !== 0) { let rotatedPart = arrayData.splice(-mod); inputArr.push(rotatedPart.concat(arrayData).join(' ')); } else { inputArr.push(arrayData.join(' ')); } } main(inputArr) }); function main(input) { process.stdout.write(input.join("\n")); }
关键改动说明
- 新增输入预处理逻辑,兼容输入末尾空行、行首尾多余空格、行内多空格等常见格式问题
- 改为按测试用例总数循环,手动控制输入行索引步进,逻辑更清晰不会出现重复/遗漏处理
- 所有数值参数显式转换为数字,避免字符串隐式转换异常
- 移除多余的
console.log调用,所有输出统一通过main函数处理,避免重复输出
内容的提问来源于stack exchange,提问作者D555
相关产品推荐
相关产品推荐

