13. Roman to Integer

Intuition

Roman numerals are usually written from largest to smallest (left to right). However, when a smaller numeral appears before a larger one, we subtract it (e.g., IV = 5 - 1 = 4).

To handle this, we iterate through the Roman string:

  • Normally, we add each numeral’s value.

  • But if the current numeral is greater than the previous, it means we’ve already added a smaller numeral that should’ve been subtracted, so we adjust using: value -= 2 * previous.

Complexity

Space Complexity
Time Complexity

O(1)\text{O}(1)

O(N)\text{O}(N)

Code

public int romanToInt(String romanString) {
    // Step 1: Create a lookup array to map Roman characters to their integer values
    int[] romanToValue = new int[26]; // Covers A-Z
    romanToValue['I' - 'A'] = 1;
    romanToValue['V' - 'A'] = 5;
    romanToValue['X' - 'A'] = 10;
    romanToValue['L' - 'A'] = 50;
    romanToValue['C' - 'A'] = 100;
    romanToValue['D' - 'A'] = 500;
    romanToValue['M' - 'A'] = 1000;

    int totalValue = 0;         // Final result
    int previousValue = -1;     // Holds the value of the previous Roman character

    // Step 2: Traverse the Roman numeral string
    for (int i = 0; i < romanString.length(); ++i) {
        int currentValue = romanToValue[romanString.charAt(i) - 'A']; // Get int value of current Roman char
        totalValue += currentValue; // Add it by default

        // Step 3: If previous character was smaller (like I before V), subtract double of it
        if (previousValue != -1 && previousValue < currentValue) {
            totalValue -= 2 * previousValue;
        }

        previousValue = currentValue; // Update for next iteration
    }

    return totalValue; // Return the final integer value
}

Last updated