Java罗马数字转整数:单独IV/IX识别错误问题求助
罗马数字转整数问题修复
你的代码核心问题出在特殊组合的判断逻辑上,同时存在不必要的链表转换操作,具体问题和修复方案如下:
问题分析
- 判断条件逻辑错误:你写的
(j - 1) == RomanNums.get('I')把索引值和罗马数字对应的数值搞混了,j-1是字符的位置索引,不是该位置字符对应的数值,导致无法正确匹配I的情况。 - 遗漏特殊组合判断:只处理了
IX(9)的情况,完全没判断IV(4)的场景,所以单独输入IV时只会计算为5+1=6。 - 未处理索引越界:当遍历到第一个字符(j=0)时,
j-1会变成-1,直接访问会触发数组越界风险。 - 冗余的链表转换:把字符串转成LinkedList完全没必要,直接操作字符串的
charAt方法更高效。
修复后的代码(优化版)
public static void romanToInt(String s) { HashMap<Character, Integer> romanNums = new HashMap<>(); romanNums.put('I', 1); romanNums.put('V', 5); romanNums.put('X', 10); romanNums.put('L', 50); romanNums.put('C', 100); romanNums.put('D', 500); romanNums.put('M', 1000); int count = 0; // 从前往后遍历,逻辑更直观 for (int i = 0; i < s.length(); i++) { int currentVal = romanNums.get(s.charAt(i)); // 如果当前值小于下一个值,说明是特殊组合(如IV、IX),减去当前值 if (i < s.length() - 1 && currentVal < romanNums.get(s.charAt(i + 1))) { count -= currentVal; } else { count += currentVal; } } System.out.println(count); }
代码说明
- 核心逻辑:罗马数字的规则是,若小值在大值左侧,则表示减法(如IV=5-1=4);否则为加法。遍历过程中判断当前值与下一个值的大小关系,决定加/减当前值,所有特殊组合(IV、IX、XL、XC、CD、CM)都能自动处理。
- 去掉冗余操作:直接操作原字符串,无需转换链表,减少内存开销。
- 避免越界:通过
i < s.length() - 1确保不会访问超出字符串长度的索引。
兼容原有思路的修复版本
如果你想保留从后往前遍历的逻辑,可修改判断条件:
public static void romanToInt(String s) { HashMap<Character, Integer> romanNums = new HashMap<>(); int count = 0; romanNums.put('I', 1); romanNums.put('V', 5); romanNums.put('X', 10); romanNums.put('L', 50); romanNums.put('C', 100); romanNums.put('D', 500); romanNums.put('M', 1000); for (int j = s.length() - 1; j >= 0; j--) { int currentVal = romanNums.get(s.charAt(j)); count += currentVal; // 确保j-1不越界,同时匹配IV和IX的情况 if (j > 0) { int prevVal = romanNums.get(s.charAt(j - 1)); if ((currentVal == romanNums.get('V') && prevVal == romanNums.get('I')) || (currentVal == romanNums.get('X') && prevVal == romanNums.get('I'))) { count -= 2 * prevVal; } } } System.out.println(count); }
内容的提问来源于stack exchange,提问作者john williams
相关产品推荐
相关产品推荐

