【Question】Roman to Integer
Given a roman numeral, convert it to an integer. Or, Given an integer, convert it to a roman numeral.
Input is guaranteed to be within the range from 1 to 3999.
【Roman numbers】
1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"};
10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};
100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};
1000~3000: {"M", "MM", "MMM"}.
Method 1: Just using if (C language)
int romanToInt(char* s) {
int len = strlen(s);
int result=0;
int i=0;
while(len)
{
if(s[i]=='M')
{result+=1000;i++;len--;}
else if(s[i]=='C')
{
if(s[i+1]=='D'){result+=400;i+=2;len-=2;}
else if(s[i+1]=='M'){result+=900;i+=2;len-=2;}
else {result+=100;i++;len--;}
}
else if(s[i]=='D') {result+=500;i++;len--;}
else if(s[i]=='X')
{
if(s[i+1]=='C'){result+=90;i+=2;len-=2;}
else if(s[i+1]=='L'){result+=40;i+=2;len-=2;}
else {result+=10;i++;len--;}
}
else if(s[i]=='L') { result+=50;i++;len--;}
else if(s[i]=='I')
{
if(s[i+1]=='X'){result+=9;i+=2;len-=2;}
else if(s[i+1]=='V'){result+=4;i+=2;len-=2;}
else {result+=1;i++;len--;}
}
else if(s[i]=='V'){ result+=5;i++;len--; }}
return result;
}
Method 2: We can find “4,9,40,90,400,900” =s[i]-s[i-1]. And they apprear if s[i]>s[i-1];
class Solution {
public:
int romanToInt(string s) {
int result = romanCharToInt(s[0]);
for(int i=1;i<s.size();i++)
{
if(romanCharToInt(s[i])>romanCharToInt(s[i-1]))
{
result+=romanCharToInt(s[i])-2*romanCharToInt(s[i-1]);
}
else{result+=romanCharToInt(s[i]);}
}
return result;
}
int romanCharToInt(char c)
{
switch(c)
{
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;
}
}
};
JAVA
<span style="font-size:12px;">public class Solution {
public int romanToInt(String s) {
int result = romanCharToInt(s.charAt(0));
for(int i=1;i<s.length();i++)
{
if(romanCharToInt(s.charAt(i))>romanCharToInt(s.charAt(i-1)))
{
result+=romanCharToInt(s.charAt(i))-2*romanCharToInt(s.charAt(i-1));
}
else{result+=romanCharToInt(s.charAt(i));}
}
return result;
}
public int romanCharToInt(char c)
{
switch(c)
{
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;
}
}
}</span>
Python language
class Solution(object):
def romanToInt(self, s):
digits = { "I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000 }
len_s = len(s)
num = 0
for i in range(0, len_s - 1):
current = digits[s[i]]
next = digits[s[i + 1]]
if current >= next:
num += current
else:
num -= current
num += digits[s[len_s - 1]]
return num