自己解法
先上自己的解法,其实就是个map,最开始对两个字符表达数字的情况有点不知道怎么判断,想了下,用了先判断两个字符是否在map中,不在的话再只用一个字符去取值。后面看了下,只有字符为可以出现在左边的3个字符时,才用尝试两个字符合并是否存在。
class Solution {
public int romanToInt(String s) {
Map<String, Integer> map = new HashMap<>(16);
map.put("I", 1);
map.put("IV", 4);
map.put("V", 5);
map.put("IX", 9);
map.put("X", 10);
map.put("XL", 40);
map.put("L", 50);
map.put("XC", 90);
map.put("C", 100);
map.put("CD", 400);
map.put("D", 500);
map.put("CM", 900);
map.put("M", 1000);
List<String> leftChars = Arrays.asList("I", "X", "C");
int l = s.length();
int res = 0;
for (int i = 0; i <= l - 1; i++) {
String n = s.substring(i, i + 1);
if (leftChars.contains(n) && i < l - 1) {
String m = s.substring(i, i + 2);
if (map.containsKey(m)) {
res += map.get(m);
i++;
} else {
res += map.get(n);
}
} else {
res += map.get(n);
}
}
return res;
}
}
大神解法
当一个字符出现在比自己大的字符左边的情况下,这个字符起到的作用其实是在做减法,比如说IV,其实就是4,这样的话,每次在计算字符的值时,先和后面的字符对比下,看取正值还是负值。
import java.util.*;
class Solution {
public int romanToInt(String s) {
int sum = 0;
int preNum = getValue(s.charAt(0));
for(int i = 1;i < s.length(); i ++) {
int num = getValue(s.charAt(i));
if(preNum < num) {
sum -= preNum;
} else {
sum += preNum;
}
preNum = num;
}
sum += preNum;
return sum;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
}