13. Roman to Integer

Math

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class Solution {
public int romanToInt(String s) {
int res = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
char nextC = i + 1 < s.length() ? s.charAt(i + 1) : ' ';
if ((c == 'I' && (nextC == 'V' || nextC == 'X')) || (c == 'X' && (nextC == 'L' || nextC == 'C')) || (c == 'C' && (nextC == 'D' || nextC == 'M'))) {
res += romanUnitToInt("" + c + nextC);
i++; // 不要忘记偏移 i, 因为消耗了两个字符
} else {
res += romanUnitToInt(String.valueOf(c));
}
}

return res;
}

private int romanUnitToInt(String s) {
switch (s) {
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;
case "IV":
return 4;
case "IX":
return 9;
case "XL":
return 40;
case "XC":
return 90;
case "CD":
return 400;
case "CM":
return 900;
default:
throw new IllegalArgumentException("Illegal raman unit: " + s);
}
}
}

Math

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class Solution {
public int romanToInt(String s) {
int res = 0;
int preNum = romanUnitToInt(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
char c = s.charAt(i);
int num = romanUnitToInt(c);
if (preNum < num) {
res -= preNum;
} else {
res += preNum;
}
preNum = num;
}
res += preNum;

return res;
}

private int romanUnitToInt(char s) {
switch (s) {
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:
throw new IllegalArgumentException("Illegal roman char: " + s);
}
}
}

References

13. Roman to Integer