# [LeetCode 13] Roman to Integer

### Question

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

### Stats

 Frequency 4 Diffficulty 2 Adjusted Difficulty 2 Time to use ----------

Ratings/Color = 1(white) 2(lime) 3(yellow) 4/5(red)

### Analysis

This question is easier than [LeetCode 12] Integer to Roman.

The basic idea is to read 2 char (as pre and cur) and then check. If pre > cur, then OK, just do the addition. If pre < cur, we need to subtract (2 * pre) from the result.

The code is easy and concise if you have the idea.

### Solution

The code explains itself.

### My code

``````public class Solution {
public int romanToInt(String s) {
if (s == null || s.length() == 0) {
return 0;
}
int ans = 0;
int pre = 0;
int cur = 0;
for (int i = 0; i < s.length(); i++) {
cur = getNum(s.charAt(i));
if (i == 0 || pre >= cur) {
ans += cur;
} else {
ans += cur - (2 * pre);
}
pre = cur;
}
return ans;
}

private int getNum(char a){
switch(a){
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;
}
}
``````

We can also do only adding. Someone posted the code in here. Read it ONLY if you are interested.

``````class Solution {
public:
int romanToInt(string s) {
// 4:IV, 9:IX, 40:XL, 90:XC, 400:CD, 900:CM,
// 1:I, 10:X, 100:C, 1000:M
int res=0;
char pre = ' ';
for(int i=0;i<s.size();i++){
if (s[i]=='M' && pre!='C') {res+=1000;}
if (s[i]=='C' && pre!='X') {res+=100;}
if (s[i]=='X' && pre!='I') {res+=10;}

if (s[i]=='M' && pre=='C') {res+=800;}
if (s[i]=='C' && pre=='X') {res+=80;}
if (s[i]=='X' && pre=='I') {res+=8;}

if (s[i]=='I' ) {res+=1;}

if (s[i]=='V' && pre!='I'){res+=5;}
if (s[i]=='L' && pre!='X'){res+=50;}
if (s[i]=='D' && pre!='C'){res+=500;}

if (s[i]=='V' && pre=='I'){res+=3;}
if (s[i]=='L' && pre=='X'){res+=30;}
if (s[i]=='D' && pre=='C'){res+=300;}

pre = s[i];
}
return res;
}
};
``````