LeetCode第13题JS实现疑问:为何仅转换罗马数字首字符?
罗马数字转整数:仅转换第一个字符的问题分析与修复
首先看你目前的代码片段,能发现两个核心问题导致只处理了第一个字符:
- 你还没写出遍历整个罗马数字字符串的逻辑,目前只初始化了映射表,但没有循环去逐个处理每个字符;
- 罗马数字的特殊减法规则(比如
IV=4、IX=9)也没在代码里体现,不过这是后话,先解决遍历的核心问题。
先把你未完成的代码补全并修正,下面是完整的可运行版本:
var romanToInt = function(s) { let result = 0; if (!s) return result; // 简化空输入的判断 const myMap = new Map(); myMap.set('I', 1); myMap.set('V', 5); myMap.set('X', 10); myMap.set('L', 50); myMap.set('C', 100); myMap.set('D', 500); myMap.set('M', 1000); // 遍历每个字符,处理罗马数字的加减规则 for (let i = 0; i < s.length; i++) { const currentVal = myMap.get(s[i]); const nextVal = myMap.get(s[i + 1]); // 如果当前值小于下一个值,说明是减法情况(比如IV=5-1) if (nextVal && currentVal < nextVal) { result -= currentVal; } else { result += currentVal; } } return result; };
关键修复点说明:
- 添加了完整的遍历逻辑:通过
for循环逐个访问字符串s中的每个字符,确保所有字符都被处理; - 处理了罗马数字的减法规则:罗马数字中,如果当前字符的值小于下一个字符的值,就需要用减法(比如
IX是10-1=9),否则直接加法; - 简化了空输入判断:用
!s替代原来的s == null,更简洁地处理空字符串、null等无效输入。
举个实际例子,输入"MCMXCIV",代码会依次处理每个字符:
- M(1000):加1000 → result=1000
- C(100) < M(1000):减100 → result=900
- M(1000):加1000 → result=1900
- X(10) < C(100):减10 → result=1890
- C(100):加100 → result=1990
- I(1) < V(5):减1 → result=1989
- V(5):加5 → result=1994,最终返回1994,符合预期。
内容的提问来源于stack exchange,提问作者cece
相关产品推荐
相关产品推荐

