You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 23:10:27