目录
/** 题目: * 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 * 字符 数值 * I 1 * V 5 * X 10 * L 50 * C 100 * D 500 * M 1000 * 例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 * 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。 * 数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况: * I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 * X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 * C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 * 给定一个罗马数字,将其转换成整数。 * */
-----代码在最下面-----
思路
1、首先先分析特殊情况
- I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
可以想,正常情况下都是 由大到小排列的,这种特殊情况则是 (左小右大)
那么如果是左小右大的话,怎么办?看下面这个例子:
e.g. :
4 不写做 IIII,而是 IV--->数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4
看这个例子,能够看出此时的I对应的值为-1,再看一个例子:
e.g. :
数字 9 表示为 IX。--->数字 1 在数字 10 的左边,所表示的数等于大数 10 减小数 1 得到的数值 9
2、解决特殊情况
- 当后面的数小于前面的数时,这时候,后面这个罗马数的值是对应数字的负数
- 所以我们在得到每一个数后,将他们所有数累加的时候,就要注意,将特殊情况里里面的数换成负数
解题方法
-
比较数,正常情况下, 前面的大于后面的数
如果罗马数所对应的数 后面的大于前面的数, 那么后面那个罗马数表现为 对应数字的负数
把一个小值放在大值的左边,就是做减法,否则为加法。 -
1、定义一个方法,用来将罗马数转换为数字
-
2、定义一个数sum来接收转换后的数
-
3、记录第一个罗马数对应的数字
-
4、循环字符s ,(注意:要从第二个数开始循环,得到从第二个数到末尾的的每一个数字---(将罗马数转换成数字,调用前面的定义的方法))
-
5、比较: 后一个数跟前面的一个数比较, 后面的大于前面的,就做减法,否则就做加法。
-
注意,我们循环是从第二个数开始的,sum累加的话,需要都加上,所以在循环外面还要再加一下。
Code代码
class Solution {
public static int romanToInt(String s) {
int sum=0;//用于记录返回数
int value = Getvalue(s.charAt(0));//为第一个罗马数所对应 的数字
for (int i = 1; i < s.length(); i++) {
//循环 从罗马数的第二个数开始:
int num=Getvalue(s.charAt(i));
//将罗马数的第二个数和第一个数比较
if (num > value) {
//则num这时大于前面的罗马数,那么做减法
sum-=value;
}else {
//则num这时小于前面的罗马数,那么做加法
sum+=value;
}
//让第一个数等于第二个数,第二个数变成第三个数,继续往下比较
value=num;
}
//由于循环是从第二个数开始的,所以最后一个数 I没有加上去,循环完闭在将最后一个数加上去!!!!!
sum+=value;
return sum;
}
private static int Getvalue(char ch) {
switch (ch){
case 'I':return 1;
case 'V':return 5;
case 'X':return 10;
case 'L':return 50;
case 'C':return 100;
case 'D':return 500;
case 'M':return 1000;
default:return 0;
}
}
}