3
3
import java .util .HashMap ;
4
4
import java .util .Map ;
5
5
6
+ /**
7
+ * A utility class to convert Roman numerals into integers.
8
+ *
9
+ * <p>Roman numerals are based on seven symbols given below:
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
+ */
6
26
public final class RomanToInteger {
7
- private RomanToInteger () {
8
- }
9
27
10
28
private static final Map <Character , Integer > ROMAN_TO_INT = new HashMap <>() {
11
29
{
@@ -19,44 +37,53 @@ private RomanToInteger() {
19
37
}
20
38
};
21
39
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
+ */
22
50
private static int romanSymbolToInt (final char symbol ) {
23
51
return ROMAN_TO_INT .computeIfAbsent (symbol , c -> { throw new IllegalArgumentException ("Unknown Roman symbol: " + c ); });
24
52
}
25
53
26
- // Roman Number = Roman Numerals
27
-
28
54
/**
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>
30
65
*
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
69
+ * @throws NullPointerException if the input is {@code null}
33
70
*/
34
- public static int romanToInt (String a ) {
35
- a = a .toUpperCase ();
36
- char prev = ' ' ;
71
+ public static int romanToInt (String roman ) {
72
+ if (roman == null ) {
73
+ throw new NullPointerException ("Input cannot be null" );
74
+ }
37
75
76
+ roman = roman .toUpperCase ();
38
77
int sum = 0 ;
39
-
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 ;
78
+ int maxPrevValue = 0 ;
79
+ for (int i = roman .length () - 1 ; i >= 0 ; i --) {
80
+ int currentValue = romanSymbolToInt (roman .charAt (i ));
81
+ if (currentValue >= maxPrevValue ) {
82
+ sum += currentValue ;
83
+ maxPrevValue = currentValue ;
54
84
} else {
55
- // subtract upcoming number until upcoming number not greater than prev max
56
- sum -= currentNum ;
85
+ sum -= currentValue ;
57
86
}
58
-
59
- prev = c ;
60
87
}
61
88
62
89
return sum ;
0 commit comments