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

JavaScript罗马数字转换代码本地正确但无法通过FreeCodeCamp测试

阿拉伯数字转罗马数字函数本地测试正常,但FreeCodeCamp全量测试失败的问题修复

你写的阿拉伯数字转罗马数字函数本地单测正常,但FreeCodeCamp所有测试失败,核心原因是全局变量romanResult的污染。

本地只调用一次convertToRoman(16)时,全局变量初始为空,计算后能得到正确结果;但FreeCodeCamp会连续运行所有测试用例,比如先测convertToRoman(2)得到"II",下一次测试时romanResult不会自动重置,后续计算会在已有结果上叠加,导致所有返回值都错误。


修复方案及优化代码

function convertToRoman(num) {
  // 将结果变量改为函数内部局部变量,每次调用都重新初始化
  let romanResult = "";

  // 简化转换逻辑,直接处理截断值与对应罗马数字的映射
  function addRomanSymbol(cutOff, symbol) {
    const count = Math.trunc(num / cutOff);
    if (count > 0) {
      romanResult += symbol.repeat(count);
      num -= count * cutOff;
    }
  }

  // 按从大到小的顺序处理所有罗马数字规则
  addRomanSymbol(1000, "M");
  addRomanSymbol(900, "CM");
  addRomanSymbol(500, "D");
  addRomanSymbol(400, "CD");
  addRomanSymbol(100, "C");
  addRomanSymbol(90, "XC");
  addRomanSymbol(50, "L");
  addRomanSymbol(40, "XL");
  addRomanSymbol(10, "X");
  addRomanSymbol(9, "IX");
  addRomanSymbol(5, "V");
  addRomanSymbol(4, "IV");
  addRomanSymbol(1, "I");

  return romanResult;
}

// 测试示例
console.log(convertToRoman(16)); // 输出 XVI

关键改动说明

  1. 移除全局变量:把romanResult移到函数内部作为局部变量,确保每次调用函数时都是全新的初始状态,彻底解决结果叠加问题。
  2. 简化逻辑结构:去掉了复杂的递归和arguments参数解析,改用顺序调用的方式处理罗马数字规则,代码更简洁易读。
  3. 优化转换函数:addRomanSymbol直接接收截断值和对应罗马数字,内部计算重复次数并拼接,同时更新剩余数值,逻辑更清晰。
  4. 规范参数接收:函数直接声明接收num参数,符合现代JavaScript写法,可读性更强。

修改后,无论平台调用多少次函数,每次都会重新初始化结果变量,所有测试用例都能正常通过。

内容的提问来源于stack exchange,提问作者MarcE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:25:24