面试经典150题——罗马数字转整数

面试经典150题 day17

      • 题目来源
      • 我的题解
        • [方法一 哈希表](#方法一 哈希表)
        • [方法二 优化版本](#方法二 优化版本)

题目来源

力扣每日一题;题序:13

我的题解

方法一 哈希表

存储单独的存在的可能字符串
时间复杂度 :O(n)
空间复杂度:O©。C表示单独存在的可能字符串数量

java 复制代码
public int romanToInt(String s) {
    Map<String,Integer> map=new HashMap<>();
    map.put("I",1);
    map.put("IV",4);
    map.put("V",5);
    map.put("IX",9);
    map.put("X",10);
    map.put("XL",40);
    map.put("L",50);
    map.put("XC",90);
    map.put("C",100);
    map.put("CD",400);
    map.put("D",500);
    map.put("CM",900);
    map.put("M",1000);
    int res=0;
    for(int i=0;i<s.length();){
        if(i<s.length()-1&&map.containsKey(s.substring(i,i+2))){
            res+=map.get(s.substring(i,i+2));
            i+=2;
        }else{
            int cur=map.get(s.substring(i,i+1));
            res+=cur;
            i++;
        }
    }
    return res;
}
方法二 优化版本

实际存储map时不需要存储String类型,方法一为了存储像"IV"、"VX"这种比较特别的值,导致需要使用String来存储。方法二不再存储特殊的值,因此转为使用Character类型进行存储。只需要判断s中相邻两个字符对应的值的差是否是4或者9的倍数,若后一个字符的数字值大于前一个字符的数字值,并且差值是4或者9的倍数,这两个相邻的字符将组成一个罗马数字。
时间复杂度:O(n)

空间复杂度:O(K)。

java 复制代码
public int romanToInt(String s) {
    Map<Character,Integer> map=new HashMap<>();
    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);
    int res=0;
    char[] data=s.toCharArray();
    int i=0;
    for(;i<data.length-1;i++){
        int num1=map.get(data[i]);
        int num2=map.get(data[i+1]);
        if((num2-num1)>0&&((num2-num1)%4==0||(num2-num1)%9==0)){
            res+=num2-num1;
            i++;
        }else{
            res+=num1;
        }
    }
    if(i==data.length-1)
        res+=map.get(data[i]);
    return res;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
晴殇i11 小时前
揭秘JavaScript中那些“不冒泡”的DOM事件
前端·javascript·面试
孟陬11 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌11 小时前
一站式了解四种限流算法
java·后端·go
绝无仅有11 小时前
Redis过期删除与内存淘汰策略详解
后端·面试·架构
绝无仅有11 小时前
Redis大Key问题排查与解决方案全解析
后端·面试·架构
华仔啊12 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
AAA梅狸猫12 小时前
Looper.loop() 循环机制
面试
AAA梅狸猫12 小时前
Handler基本概念
面试
也些宝13 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java