← Math

Roman to Integer

Easy
Python
def roman_to_int(s):
    vals={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
    r=0
    for i in range(len(s)):
        if i+1<len(s) and vals[s[i]]<vals[s[i+1]]: r-=vals[s[i]]
        else: r+=vals[s[i]]
    return r
Java
public int romanToInt(String s){
    Map<Character,Integer> v=new HashMap<>();
    v.put('I',1);v.put('V',5);v.put('X',10);v.put('L',50);v.put('C',100);v.put('D',500);v.put('M',1000);
    int r=0;
    for(int i=0;i<s.length();i++){
        if(i+1<s.length()&&v.get(s.charAt(i))<v.get(s.charAt(i+1))) r-=v.get(s.charAt(i));
        else r+=v.get(s.charAt(i));
    } return r;
}

Key Insight

Python dict literal concise. Java needs multiple put() calls.

Python → Java Differences

  • Python dict literal vs Java multiple put()
  • s[i] vs s.charAt(i)
  • Subtraction rule identical
Python
def roman_to_int(s):
    vals={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
    r=0
    for i in range(len(s)):
        if i+1<len(s) and vals[s[i]]<vals[s[i+1]]: r-=vals[s[i]]
        else: r+=vals[s[i]]
    return r
Java
public int romanToInt(String s){
    Map<Character,Integer> v=new HashMap<>();
    v.put('I',1);v.put('V',5);v.put('X',10);v.put('L',50);v.put('C',100);v.put('D',500);v.put('M',1000);
    int r=0;
    for(int i=0;i<s.length();i++){
        if(i+1<s.length()&&v.get(s.charAt(i))<v.get(s.charAt(i+1))) r-=v.get(s.charAt(i));
        else r+=v.get(s.charAt(i));
    } return r;
}

Algorithm Steps

1. Map symbols to values
2. Subtract if smaller before larger