Topic | Difficulty | Companies |
---|---|---|
Mathematical Algorithms | Medium | Amazon|Microsoft|Facebook|Twitter |
Given a string S representing a roman numeral. Convert S into integer.
Problem Note
- S is guaranteed to be within the range from 1 to 3999.
- Roman numerals are represented by seven different symbools :
SYMBOL VALUE
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
- For example, two is written as
II
in Roman numeral, just two one’s added together. Twelve is written as,XII
, which is simplyX
+II
. The number twenty seven is written asXXVII
, which isXX
+V
+II
. - Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not
IIII
. Instead, the number four is written asIV
. Because the one is before the five, so we subtract one from five to make it four. The same principle applies to the number nine, which is written asIX
. There are six instances where subtraction is used:
- I can be placed before V (5) and X (10) to make 4 and 9.
- X can be placed before L (50) and C (100) to make 40 and 90.
- C can be placed before D (500) and M (1000) to make 400 and 900.
Input Format
The only argument given is string A.
Output Format
Return an integer which is the integer verison of roman numeral string.
Example 1
Input: "III"
Output: 3
Example 2
Input: "IV"
Output: 4
Example 3
Input: "IX"
Output: 9
Example 4
Input: "LVII"
Output: 57
Explanation: L = 50, V= 5, II = 2.
Hints 1
Note how the number XVI(10+5+1) and XIV(10-1+5) differs.
In one case we are adding the numeric value of a letter and in other case we are subtracting it. How can you simulate this?
Solution Approach
The key is to notice that in a valid Roman numeral representation the letter with the most value always occurs at the start of the string.
Whenever a letter with lesser value precedes a letter of higher value, it means its value has to be added as negative of that letter’s value.
In all other cases, the values get added.
Solution
class Solution {
public int romanToInt(String s) {
int nums[] = new int[s.length()];
for(int i = 0; i < s.length(); i++){
switch (s.charAt(i)) {
case 'M':
nums[i] = 1000;
break;
case 'D':
nums[i] = 500;
break;
case 'C':
nums[i] = 100;
break;
case 'L':
nums[i] = 50;
break;
case 'X' :
nums[i] = 10;
break;
case 'V':
nums[i] = 5;
break;
case 'I':
nums[i] = 1;
break;
}
}
int sum = 0;
for(int i=0; i<nums.length-1; i++){
if(nums[i] < nums[i+1])
sum -= nums[i];
else
sum += nums[i];
}
return sum + nums[nums.length-1];
}
}