Skip to main content

Roman to Integer

LeetCode 13 | Difficulty: Easy​

Easy

Problem Description​

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 ones 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.

Example 3:

Input: s = "MCMXCIV"
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

Constraints:

- `1 <= s.length <= 15`

- `s` contains only the characters `('I', 'V', 'X', 'L', 'C', 'D', 'M')`.

- It is **guaranteed** that `s` is a valid roman numeral in the range `[1, 3999]`.

Topics: Hash Table, Math, String


Approach​

Hash Map​

Use a hash map for O(1) average lookups. Store seen values, frequencies, or indices. The key question: what should I store as key, and what as value?

When to use

Need fast lookups, counting frequencies, finding complements/pairs.

Mathematical​

Look for mathematical patterns or formulas. Consider: modular arithmetic, GCD/LCM, prime factorization, combinatorics, or geometric properties.

When to use

Problems with clear mathematical structure, counting, number properties.

String Processing​

Consider character frequency counts, two-pointer approaches, or building strings efficiently. For pattern matching, think about KMP or rolling hash. For palindromes, expand from center or use DP.

When to use

Anagram detection, palindrome checking, string transformation, pattern matching.


Solutions​

Solution 1: C# (Best: 84 ms)​

MetricValue
Runtime84 ms
Memory39.4 MB
Date2021-11-29
Solution
public class Solution {
public int RomanToInt(string s) {
if(string.IsNullOrEmpty(s))
{
return 0;
}


Dictionary<char, int> numerals = new Dictionary<char, int>()
{
{'I',1 },
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000}
};


int n = s.Length;
int sum = numerals[s[n-1]];
for(int i=n-2;i>=0;i--)
{
int current = numerals[s[i]];
int prev = numerals[s[i+1]];
sum += ((current < prev) ? -1*current : current);
}

return sum;
}
}
πŸ“œ 1 more C# submission(s)

Submission (2017-07-18) β€” 159 ms, N/A​

public class Solution {
public int RomanToInt(string s) {
Dictionary<char, int> vals = new Dictionary<char, int>()
{
{'M',1000},
{'D',500},
{'C',100},
{'L',50},
{'X',10},
{'V',5},
{'I',1}
};
int num = 0;
int prev = 0;
for (int i = s.Length-1; i >= 0; i--)
{
int temp = vals[s[i]];
if(temp<prev)
num -= temp;
else num+=temp;
prev = temp;
}
return num;
}
}

Complexity Analysis​

ApproachTimeSpace
Hash Map$O(n)$$O(n)$

Interview Tips​

Key Points
  • Start by clarifying edge cases: empty input, single element, all duplicates.
  • Hash map gives O(1) lookup β€” think about what to use as key vs value.
  • LeetCode provides 1 hint(s) for this problem β€” try solving without them first.
πŸ’‘ Hints

Hint 1: Problem is simpler to solve by working the string from back to front and using a map.