Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
题目就这么简洁,没有然后了..
所以,还需要知道由罗马数字转换成阿拉伯数字的转换方法:
1.罗马数字的组成主要是7个字母的组合:
‘I’代表1,‘V’代表5,‘X’代表10,‘L’代表50,‘C’代表100,‘D’代表500,‘M’代表1000;
2.如果左边的数字比右边的数字小,则计算方法为右边的数字减去左边的数字,反之则相加;
3.并且相同的字母不会连续出现3次以上;
知道规则以后,可以开始写代码了,首先判断异常条件,然后初始化map,将7个字母与数字的映射关系存到map中,如果是普通的初始化map,需要写7条map.put(key,value);比较麻烦,刚学了一种优雅(^_^)的写法,虽然并没有简化多少吧==初始化完map,接下来将运算规则转换成代码即可,用map.get(s.charAt(i))得到每个字母对应的数字,然后去比较相邻两个字母对应的数字大小即可,代码如下:
if(s.length()==0||s==null){
return -1;
}
//初始化map
Map<Character,Integer> map = new HashMap<Character,Integer>(){
{
put('I', 1);
put('V', 5);
put('X', 10);
put('L', 50);
put('C', 100);
put('D', 500);
put('M', 1000);
}
};
int len = s.length();
//int res = map.get(s.charAt(len-1));
int res = 0;
for(int i=0;i<len-1;i++){
if(map.get(s.charAt(i))>=map.get(s.charAt(i+1))){
res += map.get(s.charAt(i));
}
else res -= map.get(s.charAt(i));
}
return res+map.get(s.charAt(len-1));