JavaScript罗马数字转阿拉伯数字代码异常问题求助
问题分析与修复
你的代码核心错误有两个:
- 错误比较罗马字符本身而非对应数值:字符串比较是基于Unicode编码,而非罗马数字的实际值。比如字符
L的编码(76)小于V的编码(86),导致本该累加的逻辑变成减法,这就是"LVIII"算出-42的直接原因。 - 循环初始索引处理不当:i=0时,
romanArr[i-1]对应romanArr[-1],会得到undefined,虽第一次循环未崩溃,但属于潜在越界问题。
另外,循环变量i未用let声明,会污染全局作用域,这也是需要修正的细节。
修正后的代码
/** * @param {string} s * @return {number} */ var romanToInt = function(s) { let romanInts = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 } let romanArr = s.split("").reverse(); let res = romanInts[romanArr[0]]; // 先初始化第一个反转元素的值 // 从索引1开始遍历,避免访问越界的undefined for(let i = 1; i < romanArr.length; i++) { const currentVal = romanInts[romanArr[i]]; const prevVal = romanInts[romanArr[i-1]]; if(currentVal < prevVal) { res -= currentVal; } else { res += currentVal; } } return res; };
修复说明
- 数值比较替代字符比较:现在用
romanInts映射后的数值进行大小判断,完全符合罗马数字的规则逻辑。 - 初始化第一个元素:直接把反转后的第一个元素值赋值给结果,循环从索引1开始,彻底避免了
i-1越界的问题。 - 声明循环变量:用
let声明i,避免全局变量污染。
测试验证:
- 输入"LVIII":反转后数组为
["I","I","I","V","L"],计算过程为1→2→3→8→58,结果正确。 - 输入"MCMXCIV":反转后数组为
["V","I","C","X","M","C","M"],计算结果为5→4→96→106→1106→1006→1996,结果正确。
内容的提问来源于stack exchange,提问作者Suliko
相关产品推荐
相关产品推荐

