JavaScript实现罗马数字转整数无法通过全部测试,请求排查错误
罗马数字转整数代码错误排查与修复
原代码的核心问题
循环逻辑失效:第二个
for循环用i<=numArr.length作为终止条件,但每次循环都会通过shift/splice修改数组长度,导致循环次数计算完全混乱,经常提前终止,遗漏末尾元素的处理——比如LVIII最后一个I没被累加,MCMXCIV最后一组IV完全没处理,这就是你得到错误结果的直接原因。冗余且错误的特殊判断:单独写
numArr[0] === 1000的分支完全没必要,罗马数字的加减规则是通用的:当前值小于下一个值时做减法,否则做加法,不需要单独针对M做特殊处理。另外,当数组只剩最后一个元素时,numArr[1]是undefined,此时的数值比较会导致逻辑分支错误,无法正确触发最后的累加。
修正后的代码
var romanToInt = function(s) { // 用对象映射罗马字符与对应数值,比嵌套if-else更简洁 const romanNumMap = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 }; let result = 0; // 直接遍历原字符串,无需转数组二次处理 for (let i = 0; i < s.length; i++) { const currentVal = romanNumMap[s[i]]; const nextVal = romanNumMap[s[i + 1]]; // 若当前值小于下一个值(且不是最后一个元素),执行减法逻辑 if (nextVal && currentVal < nextVal) { result += nextVal - currentVal; i++; // 跳过下一个元素,避免重复计算 } else { result += currentVal; } } return result; }; console.log(romanToInt("III"), "should be 3"); console.log(romanToInt("LVIII"), "should be 58"); console.log(romanToInt("MCMXCIV"), "should be 1994");
修复说明
- 简化字符转数值逻辑:用对象映射替代大量
if-else,代码更简洁易维护。 - 修复循环终止问题:基于原字符串长度遍历,每次处理时判断下一个元素是否存在,确保所有字符都被处理,不会提前终止。
- 统一规则处理:严格遵循罗马数字的减法规则(如
IV=4、CM=900),通过i++跳过已处理的下一个元素,避免重复计算。
内容的提问来源于stack exchange,提问作者Kingsfull123
相关产品推荐
相关产品推荐

