题目:
思路:
第十二题的逆运算,方法同理。需要注意的是IV、IX、XL、XC、CD、CM这六种特殊的情况。正常情况下每个字符找到对应的数值累加,这六种特殊字符都是左边的数值比右边的数值小。
这里以IV举例,IV对应数字是1和5,1<5 ,组成的罗马字符左边比右边小。IV可以看作先减1再加5。循环每个字符,若当前字符比下个字符代表的数值小,就这么处理。
注意数组越界异常,最后一个字符一定是加法。因为 4 也是先减在加,加在后面
代码:
public static int romanToInt(String s) {
Map<Character, Integer> map = new HashMap<>();
map.put('M', 1000);
map.put('D', 500);
map.put('C', 100);
map.put('L', 50);
map.put('X', 10);
map.put('V', 5);
map.put('I', 1);
int a = 0;
for (int i = 0; i < s.length(); i++) {
//比较当前字符 和 下一个字符 大小 例如:IV 1 < 5 要用减法
//最后一个字符一定是加法,所以要加上 i < s.length() - 1
if (i < s.length() - 1 && map.get(s.charAt(i)) < map.get(s.charAt(i + 1))) {
a -= map.get(s.charAt(i));
} else {
a += map.get(s.charAt(i));
}
}
return a;
}