Roman to Integer easy
Problem Statement
Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
| Symbol | Value | |---|---| | I | 1 | | V | 5 | | X | 10 | | L | 50 | | C | 100 | | D | 500 | | M | 1000 |
For example, 2 is written as II in Roman numeral, just two one's added together. 12 is written as XII, which is simply X + II. The number 27 is written as XXVII, which is XX + 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 as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. 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.
Given a roman numeral, convert it to an integer.
Example 1:
Input: s = "III" Output: 3 Explanation: III = 3.
Example 2:
Input: s = "LVIII" Output: 58 Explanation: L = 50, V= 5, III = 3.
Steps
-
Create a map: Create a
std::unordered_map
to store the integer values corresponding to each Roman numeral symbol. This allows for efficient lookup of values. -
Iterate through the Roman numeral string: Iterate through the input string
s
from right to left. This order is crucial for handling subtractive cases (IV, IX, etc.). -
Handle subtractive cases: For each symbol, check if the current value is less than the value of the next symbol (if there is one). If it is, subtract the current value from the total; otherwise, add it to the total.
-
Return the total: After iterating through the entire string, the
total
variable will hold the integer representation of the Roman numeral.
Explanation
The key to solving this problem efficiently lies in iterating from right to left. This allows us to directly handle the subtractive cases. If we iterate left to right, we'd need extra logic to detect and handle these subtractions, making the code more complex. The unordered_map
provides fast O(1) lookups for the Roman numeral values.
Code
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int romanToInt(string s) {
unordered_map<char, int> romanMap = {
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000}
};
int total = 0;
int prevValue = 0;
for (int i = s.length() - 1; i >= 0; i--) {
int currentValue = romanMap[s[i]];
if (currentValue < prevValue) {
total -= currentValue;
} else {
total += currentValue;
}
prevValue = currentValue;
}
return total;
}
int main() {
string romanNumeral = "LVIII";
int integerValue = romanToInt(romanNumeral);
cout << "The integer value of " << romanNumeral << " is: " << integerValue << endl; // Output: 58
romanNumeral = "MCMXCIV";
integerValue = romanToInt(romanNumeral);
cout << "The integer value of " << romanNumeral << " is: " << integerValue << endl; // Output: 1994
return 0;
}
Complexity
- Time Complexity: O(n), where n is the length of the input string. We iterate through the string once.
- Space Complexity: O(1). The
unordered_map
uses constant space, regardless of the input size.