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
关键改动说明
- 移除全局变量:把
romanResult移到函数内部作为局部变量,确保每次调用函数时都是全新的初始状态,彻底解决结果叠加问题。 - 简化逻辑结构:去掉了复杂的递归和
arguments参数解析,改用顺序调用的方式处理罗马数字规则,代码更简洁易读。 - 优化转换函数:
addRomanSymbol直接接收截断值和对应罗马数字,内部计算重复次数并拼接,同时更新剩余数值,逻辑更清晰。 - 规范参数接收:函数直接声明接收
num参数,符合现代JavaScript写法,可读性更强。
修改后,无论平台调用多少次函数,每次都会重新初始化结果变量,所有测试用例都能正常通过。
内容的提问来源于stack exchange,提问作者MarcE
相关产品推荐
相关产品推荐

