1
+ //罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
2
+ //
3
+ // 字符 数值
4
+ //I 1
5
+ //V 5
6
+ //X 10
7
+ //L 50
8
+ //C 100
9
+ //D 500
10
+ //M 1000
11
+ //
12
+ // 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + I
13
+ //I 。
14
+ //
15
+ // 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5
16
+ // 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
17
+ //
18
+ //
19
+ // I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
20
+ // X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
21
+ // C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
22
+ //
23
+ //
24
+ // 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
25
+ //
26
+ //
27
+ //
28
+ // 示例 1:
29
+ //
30
+ // 输入: "III"
31
+ //输出: 3
32
+ //
33
+ // 示例 2:
34
+ //
35
+ // 输入: "IV"
36
+ //输出: 4
37
+ //
38
+ // 示例 3:
39
+ //
40
+ // 输入: "IX"
41
+ //输出: 9
42
+ //
43
+ // 示例 4:
44
+ //
45
+ // 输入: "LVIII"
46
+ //输出: 58
47
+ //解释: L = 50, V= 5, III = 3.
48
+ //
49
+ //
50
+ // 示例 5:
51
+ //
52
+ // 输入: "MCMXCIV"
53
+ //输出: 1994
54
+ //解释: M = 1000, CM = 900, XC = 90, IV = 4.
55
+ //
56
+ //
57
+ //
58
+ // 提示:
59
+ //
60
+ //
61
+ // 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
62
+ // IC 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
63
+ // 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。
64
+ //
65
+ // Related Topics 数学 字符串
66
+ // 👍 1151 👎 0
67
+
68
+ package com .changhongyuan .leetcode .editor .cn ;
69
+ class RomanToInteger {
70
+ //leetcode submit region begin(Prohibit modification and deletion)
71
+ class Solution {
72
+ public int romanToInt (String s ) {
73
+ int result = 0 ;
74
+ StringBuffer sb = new StringBuffer (s );
75
+ sb = sb .reverse ();
76
+ int i = 0 ;
77
+ while (i < sb .length ()) {
78
+ s = sb .substring (i , i + 1 );
79
+ RomanEnum romanEnum = RomanEnum .getByName (s );
80
+ result += romanEnum .getValue ();
81
+ i ++;
82
+ if (i < sb .length ()) {
83
+ s = sb .substring (i , i + 1 );
84
+ if (null != romanEnum .getBefore () && s .equals (romanEnum .getBefore ().getName ())) {
85
+ result -= romanEnum .getBefore ().getValue ();
86
+ i ++;
87
+ }
88
+ }
89
+ }
90
+
91
+ return result ;
92
+ }
93
+ }
94
+
95
+ // 字符 数值
96
+ //I 1
97
+ //V 5
98
+ //X 10
99
+ //L 50
100
+ //C 100
101
+ //D 500
102
+ //M 1000
103
+ enum RomanEnum {
104
+ I ("I" , 1 , null ),
105
+ V ("V" , 5 , I ),
106
+ X ("X" , 10 , I ),
107
+ L ("L" , 50 , X ),
108
+ C ("C" , 100 , X ),
109
+ D ("D" , 500 , C ),
110
+ M ("M" , 1000 , C ),
111
+ ;
112
+ private String name ;
113
+
114
+ private int value ;
115
+
116
+ private RomanEnum before ;
117
+
118
+ RomanEnum (String name , int value , RomanEnum before ) {
119
+ this .name = name ;
120
+ this .value = value ;
121
+ this .before = before ;
122
+ }
123
+
124
+ public static RomanEnum getByName (String name ) {
125
+ for (RomanEnum romanEnum : RomanEnum .values ()) {
126
+ if (romanEnum .getName ().equals (name )) {
127
+ return romanEnum ;
128
+ }
129
+ }
130
+ return null ;
131
+ }
132
+
133
+ public String getName () {
134
+ return name ;
135
+ }
136
+
137
+ public void setName (String name ) {
138
+ this .name = name ;
139
+ }
140
+
141
+ public int getValue () {
142
+ return value ;
143
+ }
144
+
145
+ public void setValue (int value ) {
146
+ this .value = value ;
147
+ }
148
+
149
+ public RomanEnum getBefore () {
150
+ return before ;
151
+ }
152
+
153
+ public void setBefore (RomanEnum before ) {
154
+ this .before = before ;
155
+ }
156
+ }
157
+ //leetcode submit region end(Prohibit modification and deletion)
158
+
159
+ public static void main (String [] args ) {
160
+ Solution solution = new RomanToInteger ().new Solution ();
161
+ System .out .println (solution .romanToInt ("MCMXCIV" ));
162
+ }
163
+ }
0 commit comments