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

LeetCode第13题罗马数字转整数Java实现char比较问题咨询

问题原因分析

你的字符比较逻辑s.charAt(i) == 'I'本身没有语法问题,运行异常和这个写法无关,错误来源于两个核心问题:

  • 下标越界异常:当循环变量i已经是字符串最后一个下标(即i = s.length() - 1)时,你直接调用s.charAt(i+1)会超出字符串的索引范围,抛出StringIndexOutOfBoundsException。比如输入单个罗马字符I时就会直接触发这个错误。
  • 罗马数字对应数值写错:罗马字符V对应的数值是5,你的代码中误写为加10,会直接导致计算结果错误。
  • 补充:你代码里的注释写反了,I后接X是9,接V是4,不过注释错误不影响代码运行。
修复方案

你不需要修改字符比较的写法,只要做两处调整即可:

  1. 所有访问s.charAt(i+1)的判断前,先加边界校验i < s.length() - 1,确保不会越界
  2. 将V分支的累加值从10改为5

修复后的参考代码:

class Solution {
    public int romanToInt(String s) {
        int sum = 0;
        for(int i=0;i<s.length();i++) {
            if(s.charAt(i) == 'I') {
                if(i < s.length()-1 && s.charAt(i+1) == 'X') {
                    i++;
                    sum += 9;
                } else if(i < s.length()-1 && s.charAt(i+1) == 'V') {
                    i++;
                    sum += 4;
                } else {
                    sum += 1;
                }
            } else if(s.charAt(i) == 'V') {
                sum += 5;
            } else if(s.charAt(i) == 'X') {
                if(i < s.length()-1 && s.charAt(i+1) == 'L') {
                    i++;
                    sum += 40;
                } else if(i < s.length()-1 && s.charAt(i+1) == 'C') {
                    i++;
                    sum += 90;
                } else {
                    sum += 10;
                }
            } else if(s.charAt(i) == 'L') {
                sum += 50;
            } else if(s.charAt(i) == 'C') {
                if(i < s.length()-1 && s.charAt(i+1) == 'D') {
                    i++;
                    sum += 400;
                } else if(i < s.length()-1 && s.charAt(i+1) == 'M') {
                    i++;
                    sum += 900;
                } else {
                    sum+=100;
                }
            } else if(s.charAt(i) == 'D') {
                sum += 500;
            } else if(s.charAt(i) == 'M') {
                sum += 1000;
            }
        }
        return sum;
    }
}
补充说明

其他题解先将字符赋值给char变量再比较只是个人编码习惯,两种写法运行效果完全等价,你原来的字符比较写法没有任何问题。

内容的提问来源于stack exchange,提问作者Seonjae Baek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 06:24:03