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,不过注释错误不影响代码运行。
修复方案
你不需要修改字符比较的写法,只要做两处调整即可:
- 所有访问
s.charAt(i+1)的判断前,先加边界校验i < s.length() - 1,确保不会越界 - 将
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
相关产品推荐
相关产品推荐

