罗马数字转整数

问题产生

罗马数字包含以下七种字符: IVXLCDM

1
2
3
4
5
6
7
8
字符          数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。

示例:

1
2
3
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

问题分析

按照题目的描述,可以总结如下规则:

罗马数字由 I,V,X,L,C,D,M 构成;
当小值在大值的左边,则减小值,如 IV=5-1=4;
当小值在大值的右边,则加小值,如 VI=5+1=6;
由上可知,右值永远为正,因此最后一位必然为正。
一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。

代码实现

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
public class RomeToInt {
public int rometoint(String s){
int sum=0;
int preNum=getValue(s.charAt(0));//第0位置为pre
for(int i=1;i<s.length();i++){//第1位置为当前cur,与pre进行比较。
int curNum=getValue(s.charAt(i));
if(curNum<=preNum){//当前值小于等于先前值,则sum加上pre值
sum+=preNum;
}else{
sum-=preNum;//否则减去pre值
}
preNum=curNum;//每次循环后pre跟着往后递推,跳出循环后,preNum等于最后一位。
}
sum+=preNum; //循环跳出后,计算了前n-1的累积值,需要再加上最后一位。由上分析,最后一位必为正数。
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;
}
}

public static void main(String[] args){
String s="XXVII";
RomeToInt romeToInt=new RomeToInt();
System.out.println(romeToInt.rometoint(s));
}
}