You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java罗马数字转整数:单独IV/IX识别错误问题求助

罗马数字转整数问题修复

你的代码核心问题出在特殊组合的判断逻辑上,同时存在不必要的链表转换操作,具体问题和修复方案如下:

问题分析

  1. 判断条件逻辑错误:你写的(j - 1) == RomanNums.get('I')把索引值和罗马数字对应的数值搞混了,j-1是字符的位置索引,不是该位置字符对应的数值,导致无法正确匹配I的情况。
  2. 遗漏特殊组合判断:只处理了IX(9)的情况,完全没判断IV(4)的场景,所以单独输入IV时只会计算为5+1=6。
  3. 未处理索引越界:当遍历到第一个字符(j=0)时,j-1会变成-1,直接访问会触发数组越界风险。
  4. 冗余的链表转换:把字符串转成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 16:40:27