把Sting数据类型的罗马数字转换成int型的阿拉伯数字
1. 首先看题目要求:
// 1 <= s.length <= 15
// s 仅含字符 ('I', 'V', 'X', 'L', 'C', 'D', 'M')
// 题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
// 题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
// IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
// 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。
2. 看看解题思路:
// 首先需要了解一下罗马数字的规则构成:
// I(1),V(5),X(10),L(50),C(100),D(500),M(1000)
// 其次小的值在左边,则减小值,在右边就增大(IV = 5 - 1 = 4,VI = 5 + 1 =6)
// 例如:前面是I,后面是V,那么这个数就是(-1 + 5),如果前面是V,后面是I,那么这个数就是(5 + 1)
// 代码实现的时候,可以往后多看一位,对比当前和后面一位数的关系,如果没有后一位,那必定是加法
// 思路:可以保留当前位置,然后逐个遍历。
// 遍历到下一位的时候,对比大小关系,然后确定是加法还是减法
// 且最后一位必定是加法
3. 接下来是代码:
class Solution {
public int romanToInt(String s) {
// 定义sum用于转换后的返回值
int sum = 0;
// 定义preNum用于存放前一位已经转换的罗马数字,因为是String类型的,需要先用charAt方法转换成为char
// 此处为0是因为刚开始没有接收到值,故为0
int preNum = getValue(s.charAt(0));
// 开始遍历罗马数字
for (int i = 1; i < s.length(); i++) {
// 定义一个num用于接收每一位罗马数,并对其进行转换
int num = getValue(s.charAt(i));
// 如果当前数字比前一位数字要大
if (preNum < num) {
// 做减法
sum -= preNum;
} else {
// 反之,则需要做加法
sum += preNum;
}
// 最后遍历到最后一位的时候,把当前值也给到前一位
preNum = num;
}
// 加上每一个已经转换的罗马数字
sum += preNum;
// 返回结果
return sum;
}
// 封装一个罗马数字和阿拉伯数字对应的switch-case
private 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;
}
}
}