Problem 13

Abstract / Summary

Convert a roman numeral string into its corresponding integer value.

Note

The full problem description, including helpful examples, can be found on LeetCode.

C++ 0013.cpp

class Solution {
public:
    int romanToInt(string s) {
        char prev = 0;
        int result = 0;
        for (auto c : s)
        {
            switch (c)
            {
                case 'I': result++; break;
                case 'V': if (prev == 'I') result += 5-2*1; else result += 5; break;
                case 'X': if (prev == 'I') result += 10-2*1; else result += 10; break;
                case 'L': if (prev == 'X') result += 50-2*10; else result += 50; break;
                case 'C': if (prev == 'X') result += 100-2*10; else result += 100; break;
                case 'D': if (prev == 'C') result += 500-2*100; else result += 500; break;
                case 'M': if (prev == 'C') result += 1000-2*100; else result += 1000; break;
            }

            prev = c;
        }
        return result;
    }
};
23 lines | 854 bytes | submitted August 7, 2023 | GitHub   tab size 4

Difficulty

This problem is ranked as
easy medium hard

and has an acceptance rate of about 67% (9+ million submissions).

Typical patterns to solve this problem:
  • Hash Table
  • Math
  • String
I solved 663 easy, 1250 medium and 309 hard problems

AI Disclaimer

Every single line of code was written by me, 100% from scratch, between August 2023 and August 2024.
However, two years later I set up this website and used various AI tools to generate most of the walkthrough / explanations below.

See this dedicated page for more details.
LeetCode profile | GitHub repo

Code Walkthrough

Overview

The presented implementation converts a Roman-numeral string into its integer value. It processes the input sequentially, maintaining a running total and a reference to the previously examined character. By inspecting the current character together with the previous one, the algorithm correctly accounts for the subtractive forms defined by Roman-numeral conventions.

Core Logic

The conversion is performed inside a single for-range loop that iterates over each character of the input string. Two local variables are declared before the loop: prev, initialized to zero, stores the character processed in the prior iteration, and result, initialized to zero, accumulates the numeric value.

char prev = 0;
int result = 0;
for (auto c : s)
{
    // switch handling omitted here
    prev = c;
}
return result;

Within the loop a switch statement selects the action based on the current character c. For each Roman symbol the code either adds its base value directly or, when a subtractive pattern is detected, adjusts the addition to reflect the subtraction.

Handling Subtractive Notation

Roman numerals employ a subtractive rule where a smaller symbol placed before a larger one reduces the total (e.g., “IV” equals 4). The implementation detects these patterns by comparing c with prev. When a subtractive pair is identified, the code adds the larger value and simultaneously subtracts twice the smaller value that was previously added. This technique eliminates the need for a separate subtraction step.

case 'V': if (prev == 'I') result += 5-2*1; else result += 5; break;
case 'X': if (prev == 'I') result += 10-2*1; else result += 10; break;
case 'L': if (prev == 'X') result += 50-2*10; else result += 50; break;
case 'C': if (prev == 'X') result += 100-2*10; else result += 100; break;
case 'D': if (prev == 'C') result += 500-2*100; else result += 500; break;
case 'M': if (prev == 'C') result += 1000-2*100; else result += 1000; break;

For a pair such as “IV”, the first iteration adds 1 for ‘I’. When ‘V’ is processed, prev equals ‘I’, triggering the expression 5-2*1, which effectively adds 3, yielding a total of 4. The same principle applies to all other subtractive combinations (IX, XL, XC, CD, CM).

Edge Cases Covered

The algorithm naturally handles repeated symbols because each occurrence contributes its base value independently; for example, “III” results in three successive additions of 1. It also correctly processes a subtractive pair that appears at the start of the string, as the first character sets prev and the second character’s case logic adjusts the total accordingly. Mixed sequences that combine additive and subtractive patterns (e.g., “MCMXCIV”) are resolved step by step, with each character’s contribution determined by the immediate predecessor.

Performance Characteristics

The conversion runs in a single linear pass over the input, performing a constant amount of work per character. The use of a switch statement enables the compiler to generate an efficient jump table or branch sequence, minimizing dispatch overhead. No auxiliary containers or recursive calls are introduced, keeping the memory footprint minimal. Arithmetic adjustments for subtractive cases are performed inline, avoiding extra conditional branches or look-up structures. Consequently, the routine exhibits fast execution even for the longest valid Roman-numeral strings.

written by openai gpt

ELI5 - Simplified Explanation

Imagine you have a big treasure chest and you are counting special gold coins that have secret letters written on them instead of regular numbers. This code acts like a helper who looks at each coin in your pile one by one to figure out how much they are worth.

The helper starts with an empty bag and looks at the first letter. If the letter is an I, it means you have one coin, so the helper adds it to the bag. Other letters like V, X, L, C, D, or M represent bigger piles of coins.

Sometimes, the letters are tricky. If you see a small letter before a big letter, it is like a little game where you have to subtract the value of the small letter instead of adding it. The helper keeps track of the letter it just saw so it knows if it needs to do this special trick. For example, if it sees an I followed by a V, it realizes you are holding a four, so it does the math to make sure the count stays exactly right. It does this work over and over until every single coin in the pile has been counted and added together to find the final total.

written by google gemini

Code Quality

Several LLMs ranked my code quality on a scale from 1 (very poor) to 10 (outstanding):
n = 28 | median = 7 | μ = 6.57 | σ = 1.05

Complexity Analysis

Time: linear
As a rule of thumb, the maximum input size for one second execution time is
  • factorial: up to 10 elements
  • exponential: up to 20 elements
  • polynomial: a few thousand elements
  • loglinear: up to 100,000 elements
  • linear: a few million elements
  • logarithmic: a billion elements
  • constant: practically unlimited
generated automatically

Other Solutions

I wrote a basic crawler to find other solutions to that problem.
Obviously, I did that after I solved the problem myself.

In general, AlgoMonster and WalkCCC solutions are high-quality and always worth a look.
I haven't checked most of the other solutions, but they might be helpful as well.

And of course, the LeetCode forum is always a good place (or even the best) to look for alternative approaches.

(click on a column header to sort the table)
author
author solutions
www AlgoMonster C++ Python Java TS
WalkCCC C++ Python Java
leetcode.ca C++ Python Java C# C Rust JS Ruby Go PHP TS
LeetcodeHelp C++ Python Java
MemoryLimitExceeded C++ Python
Progiez C++ Python Java
github AdelDaniel Dart
aylei Rust
begeekmyfriend C
BigEggStudy C#
black-shadows C++
bujosa Rust
chandansgowda Python
charles-wangkai Java
chenyanzhe C++
DimitrisJim C
everthis JS
fartem Ruby
FelixFan1122 C#
fengvyi C++
fpdjsns C++
gaosq0604 Python
gouthampradhan Java
halfrost Go
haoel C++
JoshCrozier JS
keineahnung2345 C++
Krazune C++
lennylxx C
linouk23 C++
lkwq007 Python
MacJim C++
martianoff Scala
pruthvikp Python
qiyuangong Java
ruoru Rust
Shamik07 Dart
shreymehul C#
sonugiri1043 C++
suxrobGM C#
trung-hn Python
varunu28 Java
vli02 C
vthwang Java
XiaotaoGuo C++
YuriSpiridonov Python
AlgoMonster C++, Python, Java, TypeScript
WalkCCC C++, Python, Java
leetcode.ca C, C++, C#, Go, Java, JavaScript, PHP, Python, Ruby, Rust, TypeScript
LeetcodeHelp C++, Java, Python
MemoryLimitExceeded Python, C++
Progiez C++, Java, Python
AdelDaniel Dart
aylei Rust
begeekmyfriend C
BigEggStudy C#
black-shadows C++, C++
bujosa Rust
chandansgowda Python
charles-wangkai Java
chenyanzhe C++
DimitrisJim C
everthis JavaScript
fartem Ruby
FelixFan1122 C#
fengvyi C++
fpdjsns C++
gaosq0604 Python
gouthampradhan Java
halfrost Go
haoel C++
JoshCrozier JavaScript
keineahnung2345 C++
Krazune C++
lennylxx C
linouk23 C++
lkwq007 Python
MacJim C++
martianoff Scala
pruthvikp Python
qiyuangong Java
ruoru Rust
Shamik07 Dart
shreymehul C#
sonugiri1043 C++
suxrobGM C#
trung-hn Python
varunu28 Java
vli02 C
vthwang Java
XiaotaoGuo C++
YuriSpiridonov Python
66 links | 46 authors | 13 languages

Videos

These are a few popular YouTube videos for this problem:
YouTube video 'Roman to Integer | Leetcode -13 | Algorithms Made Easy'
Algorithms Made Easy 6 mins
Roman to Integer | Leetcode -13 | Algorithms Made Easy
YouTube video '13. Roman to Integer || Java || Leetcode || Hindi'
Coding Sphere 12 mins
13. Roman to Integer || Java || Leetcode || Hindi
YouTube video 'Integer to Roman -(Amazon, Facebook, Microsoft, Twitter, Apple, Google..): Explanation ➕ Live Coding'
codestorywithMIK 18 mins
Integer to Roman -(Amazon, Facebook, Microsoft, Twitter, Apple, Google..): Explanation ➕ Live Coding
YouTube video 'Roman to Integer - Leetcode 13 - Arrays & Strings (Python)'
Greg Hogg 7 mins
Roman to Integer - Leetcode 13 - Arrays & Strings (Python)
YouTube video 'Leetcode | 13. Roman to Integer | Easy | Java Solution'
Developer Docs 9 mins
Leetcode | 13. Roman to Integer | Easy | Java Solution
YouTube video '13. Roman to Integer | Day 005 | Short & Simple Solution'
Aryan Mittal 6 mins
13. Roman to Integer | Day 005 | Short & Simple Solution
YouTube video 'Roman to Integer - LeetCode 13 | Java'
Code with Carter 7 mins
Roman to Integer - LeetCode 13 | Java
YouTube video 'LeetCode 13 | Roman to Integer | Solution Explained (Java)'
Xavier Elon 8 mins
LeetCode 13 | Roman to Integer | Solution Explained (Java)
YouTube video 'Roman To Integer - LeetCode 13 - Coding Interview Questions'
One Code Man 4 mins
Roman To Integer - LeetCode 13 - Coding Interview Questions
YouTube video '13. Roman to Integer | LEETCODE | Top Interview Questions | EASY'
code Explainer 8 mins
13. Roman to Integer | LEETCODE | Top Interview Questions | EASY
YouTube video 'Roman to Integer - LeetCode 13 - JavaScript'
AlgoJS 6 mins
Roman to Integer - LeetCode 13 - JavaScript
YouTube video 'DSA Phir se with Sumeet | Leetcode 13 | Roman to Integer'
Pepcoding 16 mins
DSA Phir se with Sumeet | Leetcode 13 | Roman to Integer
YouTube video 'Roman to Integer | String | LeetCode 13 | Amazon Apple'
Naresh Gupta 11 mins
Roman to Integer | String | LeetCode 13 | Amazon Apple
YouTube video 'How to Solve "13 Roman to Integer" on LeetCode? - Javascript'
Becoming A Better Dev (with David) 9 mins
How to Solve "13 Roman to Integer" on LeetCode? - Javascript
YouTube video 'Roman to Integer Python Solution - LeetCode #13'
Professor Oakes 6 mins
Roman to Integer Python Solution - LeetCode #13
YouTube video 'Roman to Integer - LeetCode 13 - Python #leetcode #leetcode150 #topinterview150'
Deepti Talesra 7 mins
Roman to Integer - LeetCode 13 - Python #leetcode #leetcode150 #topinterview150
YouTube video 'Leetcode 13 Roman to Integer | Checkout Coding Decoded SDE preparation Sheet link below'
Coding Decoded 9 mins
Leetcode 13 Roman to Integer | Checkout Coding Decoded SDE preparation Sheet link below
YouTube video 'Roman to Integer - Leetcode 13 - JavaScript Solution'
Web Coder Abhishek 5 mins
Roman to Integer - Leetcode 13 - JavaScript Solution
YouTube video 'Roman to Integer | Leetcode 13 | Approach & Code | O(n)  #dsa'
Learn With Chirag 8 mins
Roman to Integer | Leetcode 13 | Approach & Code | O(n) #dsa
YouTube video 'Leetcode 13: Roman to Integer'
Algorithms Casts 6 mins
Leetcode 13: Roman to Integer
20 videos   did my crawler come up with invalid videos ? drop me a line.

Similar Problems

1 similar problem

Solved On The Same Day

39 easy 31 medium 1 hard
72 solutions   August 7, 2023

Extra

There are a few extra pages giving you some insights into my setup:
  • Tech Stack - my development environment and tools
  • AI - how AI helped me create this website (NOT solving the problems)
  • Progress - progression over time
  • Quality - code quality