LeetCode刷题记录(八):罗马数字转整数

162 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第8天,点击查看活动详情

题目:罗马数字转整数

题目如下图所示,也可以在LeetCode题目中找到此题。

image.png

题目解析

题目提供素材

  1. 提供一个罗马数字,比如VI、VII。
  2. 罗马数字的长度在1到15之间。
  3. 关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics

注:罗马数字的规则,大家需要自行了解一下。重点了解类似IV这种相对小值在左,大值在右,就代表大值要减小值。

字符数值
I1
V5
X10
L50
C100
D500
M1000

我的解读

从题目的描述来看,就是一个单纯的将罗马数字转成一个阿拉伯数字。

只需要遍历一个个的罗马字母就可以,然后单独处理一下小值在大值的左边的情况,就比如IV这种罗马数字。

解题思路

依然是暴力美学,就是循环操作。

不过首先要把所有的罗马字符保存在Map集合中,每次都可以直接通过Map集合来获取罗马字符对应的整数值。

  1. 在循环遍历中,对罗马字符对应的整数值与其上一个罗马字符对应的整数值做对比。

  2. 如果当前罗马字符大于上一个罗马字符,那么就代表存在特殊情况;这个时候就要使用当前的数值减去双倍的上一个数值。

  3. 为什么要减去双倍?因为在上一个循环任务中,总数已经加上了相应数值,如果要按照特殊情况来处理,那么就必须减去双倍的值。

代码

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;
    }

}

执行结果

image.png