一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情。
题目:罗马数字转整数
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
题目提供素材
- 提供一个罗马数字,比如VI、VII。
- 罗马数字的长度在1到15之间。
- 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。
注:罗马数字的规则,大家需要自行了解一下。重点了解类似IV这种相对小值在左,大值在右,就代表大值要减小值。
| 字符 | 数值 |
|---|---|
| I | 1 |
| V | 5 |
| X | 10 |
| L | 50 |
| C | 100 |
| D | 500 |
| M | 1000 |
我的解读
从题目的描述来看,就是一个单纯的将罗马数字转成一个阿拉伯数字。
只需要遍历一个个的罗马字母就可以,然后单独处理一下小值在大值的左边的情况,就比如IV这种罗马数字。
解题思路
依然是暴力美学,就是循环操作。
不过首先要把所有的罗马字符保存在Map集合中,每次都可以直接通过Map集合来获取罗马字符对应的整数值。
-
在循环遍历中,对罗马字符对应的整数值与其上一个罗马字符对应的整数值做对比。
-
如果当前罗马字符大于上一个罗马字符,那么就代表存在特殊情况;这个时候就要使用当前的数值减去双倍的上一个数值。
-
为什么要减去双倍?因为在上一个循环任务中,总数已经加上了相应数值,如果要按照特殊情况来处理,那么就必须减去双倍的值。
代码
class Solution {
public static Map<String,Integer> map = new HashMap<>();
static{
map.put("I", 1);
map.put("V", 5);
map.put("X", 10);
map.put("L", 50);
map.put("C", 100);
map.put("D", 500);
map.put("M", 1000);
}
public int romanToInt(String s) {
int num = 0;
String[] luomas = s.split("");
for(int i = 0; i < luomas.length; i++){
if(i == 0){
num = map.get(luomas[i]);
}else{
if(map.get(luomas[i]) > map.get(luomas[i-1])){
num = num + map.get(luomas[i]) - map.get(luomas[i-1]) * 2;
}else{
num = num + map.get(luomas[i]);
}
}
}
return num;
}
}