题目描述:

Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

解题思路:

要求将一个罗马数字转换为整数,首先要知道罗马数字与阿拉伯数字的对应转换关系,对应关系如下:
    I   ->  1
    V   ->  5
    X   ->  10
    L   ->  50
    C   ->  100
    D   ->  500 
    M   ->  1000

例如:
    将XVII转换为整数
    X = 10
    V = 5
    I = 1
    I = 1
    显然结果为 10+5+1+1 = 17

考虑: 如果将XCIX转换为整数是多少呢?

X = 10
C = 100
I = 1
X = 10
难道结果为 10+100+1+10 = 121 ?  
实际结果应该是 (100-10)+(10-1) = 99  

所以,转换过程不仅仅是将每个字母转换为对应的数字以后相加得出结果,解题过程应该是这样的:

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
输入:XCIX
当前位为current, 上一位为pre,结果为result
初始化result = pre
如果 current<=pre 时,result += current, 比如 VI = 5+1 = 6
如果 current>pre 时,result = (result-pre) + (current-pre) ,比如XC = (10-10) + (100-10) = 90
```
实现代码如下(Java)
```java
public int romanToInt(String s) {
if (s == null || s.equals("")) {
return 0;
}
int pre = toNumber(s.charAt(0));
int result = pre;
for (int i = 1; i < s.length(); i++) {
int current = toNumber(s.charAt(i));
if (current > pre) {
result = result - pre + (current - pre);
} else {
result += current;
}
pre = current;
}
return result;
}
public int toNumber(char c) {
switch (c) {
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;
}
return 0;
}