33import java .util .HashMap ;
44import java .util .Map ;
55
6+ /**
7+ * A utility class to convert Roman numerals into integers.
8+ *
9+ * <p>Roman numerals are based on seven symbols:
10+ * <ul>
11+ * <li>I = 1</li>
12+ * <li>V = 5</li>
13+ * <li>X = 10</li>
14+ * <li>L = 50</li>
15+ * <li>C = 100</li>
16+ * <li>D = 500</li>
17+ * <li>M = 1000</li>
18+ * </ul>
19+ *
20+ * <p>If a smaller numeral appears before a larger numeral, it is subtracted.
21+ * Otherwise, it is added. For example:
22+ * <pre>
23+ * MCMXCIV = 1000 + (1000 - 100) + (100 - 10) + (5 - 1) = 1994
24+ * </pre>
25+ */
626public final class RomanToInteger {
7- private RomanToInteger () {
8- }
927
1028 private static final Map <Character , Integer > ROMAN_TO_INT = new HashMap <>() {
1129 {
@@ -19,44 +37,49 @@ private RomanToInteger() {
1937 }
2038 };
2139
40+ private RomanToInteger () {
41+ }
42+
43+ /**
44+ * Converts a single Roman numeral character to its integer value.
45+ *
46+ * @param symbol the Roman numeral character
47+ * @return the corresponding integer value
48+ * @throws IllegalArgumentException if the symbol is not a valid Roman numeral
49+ */
2250 private static int romanSymbolToInt (final char symbol ) {
2351 return ROMAN_TO_INT .computeIfAbsent (symbol , c -> { throw new IllegalArgumentException ("Unknown Roman symbol: " + c ); });
2452 }
2553
26- // Roman Number = Roman Numerals
27-
2854 /**
29- * This function convert Roman number into Integer
55+ * Converts a Roman numeral string to its integer equivalent.
56+ * Steps:
57+ * <ol>
58+ * <li>Iterate over the string from right to left.</li>
59+ * <li>For each character, convert it to an integer value.</li>
60+ * <li>If the current value is greater than or equal to the max previous value, add it.</li>
61+ * <li>Otherwise, subtract it from the sum.</li>
62+ * <li>Update the max previous value.</li>
63+ * <li>Return the sum.</li>
64+ * </ol>
3065 *
31- * @param a Roman number string
32- * @return integer
66+ * @param roman the Roman numeral string
67+ * @return the integer value of the Roman numeral
68+ * @throws IllegalArgumentException if the input contains invalid Roman characters
3369 */
34- public static int romanToInt (String a ) {
35- a = a .toUpperCase ();
36- char prev = ' ' ;
37-
70+ public static int romanToInt (String roman ) {
71+ roman = roman .toUpperCase ();
3872 int sum = 0 ;
73+ int maxPrevValue = 0 ;
3974
40- int newPrev = 0 ;
41- for (int i = a .length () - 1 ; i >= 0 ; i --) {
42- char c = a .charAt (i );
43-
44- if (prev != ' ' ) {
45- // checking current Number greater than previous or not
46- newPrev = romanSymbolToInt (prev ) > newPrev ? romanSymbolToInt (prev ) : newPrev ;
47- }
48-
49- int currentNum = romanSymbolToInt (c );
50-
51- // if current number greater than prev max previous then add
52- if (currentNum >= newPrev ) {
53- sum += currentNum ;
75+ for (int i = roman .length () - 1 ; i >= 0 ; i --) {
76+ int currentValue = romanSymbolToInt (roman .charAt (i ));
77+ if (currentValue >= maxPrevValue ) {
78+ sum += currentValue ;
79+ maxPrevValue = currentValue ;
5480 } else {
55- // subtract upcoming number until upcoming number not greater than prev max
56- sum -= currentNum ;
81+ sum -= currentValue ;
5782 }
58-
59- prev = c ;
6083 }
6184
6285 return sum ;
0 commit comments