File tree Expand file tree Collapse file tree 1 file changed +13
-0
lines changed
src/com/blankj/easy/_0013 Expand file tree Collapse file tree 1 file changed +13
-0
lines changed Original file line number Diff line number Diff line change 10
10
*/
11
11
12
12
public class LJSolution {
13
+ /**
14
+ * 罗马数字的逻辑
15
+ * 0. I=1、V=5、X=10、L=50、C=100、D=500、M=1000;
16
+ * 1. 相同数字连写,所表示的数等于这些数字相加得到的数,如III=3;
17
+ * 2. 小的数字在大的数字右边,所表示的数等于这些数字相加得到的数,如VIII=8、XII=12;
18
+ * 3. 小的数字(仅限I=1、X=10和C=100)在大的数字左边,所表示的数等于大数减小数得到的数,如IV=4、IX=9;
19
+ */
13
20
public int romanToInt (String s ) {
21
+ // 构建罗马数字和阿拉伯数字的映射关系,并存入映射表
14
22
Map <Character , Integer > map = new HashMap <>();
15
23
map .put ('I' , 1 );
16
24
map .put ('V' , 5 );
@@ -19,12 +27,17 @@ public int romanToInt(String s) {
19
27
map .put ('C' , 100 );
20
28
map .put ('D' , 500 );
21
29
map .put ('M' , 1000 );
30
+ // 获取罗马数字字符串的长度
22
31
int len = s .length ();
32
+ // 初始化sum,并将最后一个罗马数字值的映射阿拉伯数字赋值给sum
23
33
int sum = map .get (s .charAt (len -1 ));
34
+ // 从倒数第二个罗马数字开始,到第一个罗马数字结束,遍历,注意--i,先-1再引用
24
35
for (int i = len - 2 ; i >= 0 ; --i ) {
25
36
if (map .get (s .charAt (i )) < map .get (s .charAt (i + 1 ))) {
37
+ // 如果左边的[s.charAt(i)]小于右边的[s.charAt(i+1)],sum - 左边的
26
38
sum -= map .get (s .charAt (i ));
27
39
} else {
40
+ // 如果左边的[s.charAt(i)]大右边的[s.charAt(i+1)],sum + 左边的
28
41
sum += map .get (s .charAt (i ));
29
42
}
30
43
}
You can’t perform that action at this time.
0 commit comments