Kattis题目Stream Lag代码求助:仅7/20测试用例通过
Kattis Stream Lag 代码错误排查求助
我为Kattis平台的Stream Lag题目编写了如下JavaScript代码,但仅通过了7/20的测试用例,不清楚问题所在,请求帮助排查错误。
var readline = require("readline"); var frames = []; var rl = readline.createInterface({ input: process.stdin, output: process.stdout, }); let numberOfFrames; rl.on("line", function (numberLine) { if (numberLine.length == 1) { numberOfFrames = parseInt(numberLine); return; } const numbers = numberLine.split(" "); // [1,2] frames.push({ sec: numbers[0], seq: numbers[1] }); frames.sort((a, b) => { return a.seq - b.seq; }); if (frames.length == numberOfFrames) { console.log(caculateTotalSeconds(frames)); rl.close(); process.exit(0); } }); const caculateTotalSeconds = (frames) => { let currentSecond = 1; let currentDelay = 0; frames.forEach((frame, i) => { frameSec = parseInt(frame.sec); frameSeq = parseInt(frame.seq); if (currentSecond < frameSec) { currentDelay = currentDelay + (frameSec - currentSecond); currentSecond = frameSec + 1; } else { currentSecond++; } if (currentSecond < frameSeq) { currentDelay = currentDelay + (frameSeq - currentSecond); currentSecond = frameSeq + 1; } }); return currentDelay; };
代码中的问题分析
1. 输入处理逻辑错误
用numberLine.length == 1判断第一行(帧数量)完全不可靠:
- 当帧数量是两位数(比如10、20)时,第一行字符串长度大于1,会被错误识别为帧数据,导致
numberOfFrames从未被正确赋值,后续frames.length == numberOfFrames的判断永远不成立,程序无法输出结果或输出错误。 - 正确做法:通过读取行的顺序判断第一行,用计数器记录已读取行数,第一行即为帧数量。
修改示例:
let lineCount = 0; rl.on("line", function (numberLine) { lineCount++; if (lineCount === 1) { numberOfFrames = parseInt(numberLine.trim()); return; } // 后续帧数据处理逻辑 });
2. 变量未声明导致全局污染
caculateTotalSeconds函数中,frameSec和frameSeq没有用let/var声明,会自动成为全局变量。遍历帧过程中变量会被不断覆盖,导致计算逻辑混乱,出现不可预期的错误。
修改示例:
const frameSec = parseInt(frame.sec); const frameSeq = parseInt(frame.seq);
3. 播放时间与延迟计算逻辑错误
当前代码分开处理帧的到达时间(frameSec)和序列要求时间(frameSeq),逻辑顺序错误,未正确合并两者的约束:
- 每个帧的最早可播放时间应该是
max(currentSecond, frameSec, frameSeq),必须同时满足:上一帧播放完毕、帧已到达、符合序列播放时间要求。 - 原代码先处理到达时间再处理序列时间,会导致重复计算或遗漏约束,比如当
frameSec > frameSeq时,原代码跳到frameSec + 1后,若frameSeq < frameSec + 1,则不会处理序列时间,完全不符合实际播放逻辑。
正确的计算逻辑示例:
const calculateTotalSeconds = (frames) => { let currentTime = 1; let totalDelay = 0; frames.forEach(frame => { const sec = parseInt(frame.sec); const seq = parseInt(frame.seq); // 计算最早可播放的开始时间 const startTime = Math.max(currentTime, sec, seq); // 根据题目要求选择对应延迟计算方式: // 播放时间与序列时间的差值总和:totalDelay += startTime - seq; // 播放时间与到达时间的差值总和:totalDelay += startTime - sec; // 总等待时间(当前时间到开始播放的时间):totalDelay += startTime - currentTime; totalDelay += startTime - currentTime; // 示例:总等待时间 currentTime = startTime + 1; // 播放需1秒,下一帧起始时间为startTime+1 }); return totalDelay; };
4. 排序逻辑冗余
每次添加一个帧就调用frames.sort(),会导致不必要的性能损耗。正确做法是等所有帧读取完毕后,再执行一次排序即可。
修改示例:
if (frames.length == numberOfFrames) { frames.sort((a, b) => parseInt(a.seq) - parseInt(b.seq)); console.log(calculateTotalSeconds(frames)); rl.close(); }
内容的提问来源于stack exchange,提问作者Mojan
相关产品推荐
相关产品推荐

