Roman to Integer 419
Question
Given a roman numeral, convert it to an integer.
The answer is guaranteed to be within the range from 1 to 3999.
Symbol I V X L C D M
Value 1 5 10 50 100 500 1,000
Example
IV -> 4
XII -> 12
XXI -> 21
XCIX -> 99
Solution
罗马数字和阿拉伯数字转化,用一个map来保存之前的对应关系。同时要考虑几种特殊情况比如IV,IX, XL, XC, CD, CM。
方法一:从后往前把罗马数字表示的数加起来,只要考虑两种情况:
如果当前位比后面一位小,则表示出现上面说的那几个特殊情况,因此要将当前位表示的数减去
如果当前位比后面一位大或者相等,则直接加上当前位表示的数即可
方法二:我们也可以每次跟前面的数字比较,如果小于等于前面的数字,我们先加上当前的数字,如果大于的前面的数字,我们加上当前的数字减去二倍前面的数字,这样可以把在上一个循环多加数减掉。代码类似与第一种方法。
代码如下:
public class Solution {
/**
* @param s Roman representation
* @return an integer
*/
public int romanToInt(String s) {
// Write your code here
if(s == null || s.length() == 0){
return 0;
}
int n = s.length();
HashMap<Character, Integer> map = new HashMap<Character, Integer>();
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 res = map.get(s.charAt(n - 1));
for(int i = n - 2; i >= 0; i--){
if(map.get(s.charAt(i + 1)) <= map.get(s.charAt(i))){
res += map.get(s.charAt(i));
}else{
res -= map.get(s.charAt(i));
}
}
return res;
}
}