罗马数字转整数:MCMXCIV计算错误,求JavaScript代码排查帮助
罗马数字转整数函数问题排查与修复
问题根源
逻辑或判断完全错误:
代码里arrayChar[i]===("I"||"X"||"C")这行是致命bug。因为"I"||"X"||"C"的运算结果是第一个真值"I",所以这个条件实际等同于arrayChar[i]==="I"——也就是说,只有I能进入前面的特殊规则判断,X和C永远走else分支直接加基础值。这就是MCMXCIV算出2214的原因:M后的C没触发“C在M前加900”的逻辑,而是直接加了100;后面的X也没触发“X在C前加90”,直接加了10,最后总和自然错了。分支判断冗余(次要优化点):
- 第一个if块里的三个
if是独立执行的,比如匹配I后还会去检查X和C的条件,完全没必要,改成else if更高效。 - else块里的所有字符判断也都是独立
if,同样建议改成else if,减少无意义的判断。
- 第一个if块里的三个
修复后的代码
/** * @param {string} s * @return {number} */ var romanToInt = function(s) { // I=1,V=5,X=10,L=50,C=100,D=500,M=1000 const arrayChar = s.split(""); let count = 0; for(let i = 0; i < arrayChar.length; i++){ // 修正条件:分别检查当前字符是否为I/X/C,且不是最后一个字符 if(i < arrayChar.length - 1 && (arrayChar[i] === "I" || arrayChar[i] === "X" || arrayChar[i] === "C")){ if(arrayChar[i] === "I"){ if(arrayChar[i+1] === "V"){ count += 4; i++; } else if(arrayChar[i+1] === "X"){ count += 9; i++; } else { count += 1; } } else if(arrayChar[i] === "X"){ if(arrayChar[i+1] === "L"){ count += 40; i++; } else if(arrayChar[i+1] === "C"){ count += 90; i++; } else { count += 10; } } else if(arrayChar[i] === "C"){ if(arrayChar[i+1] === "D"){ count += 400; i++; } else if(arrayChar[i+1] === "M"){ count += 900; i++; } else { count += 100; } } } else { if(arrayChar[i] === "I"){ count += 1; } else if(arrayChar[i] === "V"){ count += 5; } else if(arrayChar[i] === "X"){ count += 10; } else if(arrayChar[i] === "L"){ count += 50; } else if(arrayChar[i] === "C"){ count += 100; } else if(arrayChar[i] === "D"){ count += 500; } else if(arrayChar[i] === "M"){ count += 1000; } } } return count; };
验证结果
修复后测试MCMXCIV:
M→ 累加1000C后接M→ 累加900,跳过下一个MX后接C→ 累加90,跳过下一个CI后接V→ 累加4,跳过下一个V
最终总和1000+900+90+4=1994,符合预期。
内容的提问来源于stack exchange,提问作者IIIIIIIIIIIIIIIIIlllIIllIIllII
相关产品推荐
相关产品推荐

