一、自己想的
只有提到的六种情况是-,其他都是+
public int romanToInt1(String s) {
int res = 0;
int n = s.length();
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
int flag;
for( int i =n-1; i>=0; i-- ) {
char c = s.charAt(i);
flag = 1;
if(c == 'I' && i != n-1 ) {
if(s.charAt(i+1) == 'V' || s.charAt(i+1) == 'X') {
flag = 0;
}
}else if(c == 'X' && i != n-1) {
if(s.charAt(i+1) == 'L' || s.charAt(i+1) == 'C') {
flag = 0;
}
} else if (c == 'C' && i != n-1) {
if(s.charAt(i+1) == 'D' || s.charAt(i+1) == 'M') {
flag = 0;
}
}
if(flag == 0){
res -= map.get(c);
}else {
res += map.get(c);
}
}
return res;
}
二、官方题解
倒序遍历,观察到,只要n[i]>n[i-1]就是减(例如IV),其余情况是加.
当然上述情况和六种情况是充要条件,因为比如"IM"这种是非法罗马数字。
public int romanToInt1(String s) {
int res = 0;
int n = s.length();
Map<Character, Integer> map = new HashMap<>();
map.put('I', 1);
map.put('V', 5);
map.put('X', 10);
map.put('L', 50);
map.put('C', 100);
map.put('D', 500);
map.put('M', 1000);
for( int i =n-1; i>=0; i-- ) {
int num = map.get(s.charAt(i));
if(i!=n-1 && num < map.get(s.charAt(i+1)) ) {
res -= num;
}else{
res += num;
}
}
return res;
}