LeetCode13:罗马数字转整数
罗马数字包含以下七种字符I,V,X,L,C,D和M
字符数值:
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如,罗马数字2写做II,12写成XII,即是X+I+I
示例:
输入:s = "III"
输出:3
输入:s = "IV"
输出:4
思路
这个刚好和LeetCode12:整数转罗马数字相反,我们在知道罗马数字之后,只需要比对相应的数值相加就可,在比对的时候,因为有类似IV=4的情况,就需要判断后一位的数值是否大于前一位,如果是,就+V-I
比如:对于一个输入为CXIV的罗马数字,第一次遍历
遍历 C,判断C后面的数值是否大于C,不大于,则ans=ans+C
遍历X,判断X后面的数值是否大于X,不大于,则ans=ans+X
遍历I,判断I后面的数值是否大于I,大于,则ans=ans-I+V
输出结果:114
解法
我们可以在代码中维护一个map,将罗马数字和对应数值关联
Map<Character, Integer> map = new HashMap<Character, Integer>(){{
put('I', 1);
put('V', 5);
put('X', 10);
put('L', 50);
put('C', 100);
put('D', 500);
put('M', 1000);
}};
public int romanToInt(String s){
// 结果res, 字符串长度len
int res = 0, len = s.length();
// 遍历字符串,更新结果res
for (int i = 0; i < len; i++) {
// 判断是否后一个数值大于前一个数值
if (i < len - 1 && map.get(s.charAt(i)) < map.get(s.charAt(i+1))){
// 是就减去
res = res - map.get(s.charAt(i));
}else {
// 否就加上
res = res + map.get(s.charAt(i));
}
}
return res;
}
测试
public static void main(String[] args) {
LeetCode13 lc = new LeetCode13();
System.out.println(lc.romanToInt("XIII"));
}
结果
13