13. Roman to Integer


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

Method 1

【O(n) time | O(1) space】
package Leetcode.Greedy;

import java.util.HashMap;
import java.util.Map;

/**
 * @author zhengxingxing
 * @date 2024/12/07
 */
public class RomanToInteger {
    public static int romanToInt(String s) {
        // Create a hash map to store Roman numeral character values
        Map<Character, Integer> romanValues = new HashMap() ;

        int result = 0;

        // Iterate through the Roman numeral string from left to right
        for (int i = 0; i < s.length(); i++) {
            // Get the integer value of the current Roman numeral character
            int currentValue = romanValues.get(s.charAt(i));

            // Determine how to add or subtract the current value
            // There are two scenarios:
            // 1. This is the last character in the string
            // 2. The current character's value is greater than or equal to the next character's value
            // If either of these conditions is true, we add the current value
            if (i == s.length() - 1 || currentValue >= romanValues.get(s.charAt(i + 1))) {
                // Normal case: add the current value
                // This handles most Roman numerals like III (3), VI (6), etc.
                result += currentValue;
            } else {
                // Special case: subtract the current value
                // This handles exceptions like IV (4), IX (9), XC (90), etc.
                // When a smaller value appears before a larger value, we subtract
                result -= currentValue;
            }
        }

        return result;
    }


    public static void main(String[] args) {

        // Test cases to demonstrate various Roman numeral conversions
        String[] testCases = {
                "III",       // Standard case: 3
                "IV",        // Subtraction case: 4
                "IX",        // Another subtraction case: 9
                "LVIII",     // Mixed case: 58
                "MCMXCIV"    // Complex case: 1994
        };

        // Iterate through test cases and print results
        for (String testCase : testCases) {
            int result = romanToInt(testCase);
            System.out.println("Roman Numeral: " + testCase +
                    " | Integer Value: " + result);
        }
    }
}




Enjoy Reading This Article?

Here are some more articles you might like to read next:

  • 2379. Minimum Recolors to Get K Consecutive Black Blocks
  • 2471. Minimum Number of Operations to Sort a Binary Tree by Level
  • 1387. Sort Integers by The Power Value
  • 2090. K Radius Subarray Averages
  • 2545. Sort the Students by Their Kth Score