疏窗

  • 首页
  • 生活
  • Java
  • Python
  • Golang
  • 其他
  • 归档

  • 搜索
leetcode jdk 生活 nas nosql 数据库 线程 爬虫 中间件

leetcode第十三题 罗马数字转整数

发表于 2022-06-24 | 分类于 Java | 0 | 阅读次数 1495

题目:

/**
 * 罗马数字包含以下七种字符: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。
 * 给定一个罗马数字,将其转换成整数。
 * 来源:力扣(LeetCode)
 * 链接:https://leetcode.cn/problems/roman-to-integer
 * 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
 */

难度:

简单

思路分析:

利用map映射对应罗马字符和其对应的值,排除掉特殊情况后数字之和就是结果。

第一次提交代码:

整体思路没问题,但是没有考虑到如 "MCMXCIV" 的复杂情况,即字符串可能同时存在多种特殊情况,所以提交不通过!

 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);
        switch(s){
            case "I":
                return 1;
            case "II":
                return 2;
            case "III":
                return 3;
            case "IV":
                return 4;
            case "IX":
                return 9;
            case "XL":
                return 40;
            case "XC":
                return 90;
            case "CD":
                return 400;
            case "CM":
                return 900;
        }
        int num = 0;
        for(int i = 0; i < s.length(); i++){
            num += map.get(s.charAt(i));
        }
        return num;
}

修改后的代码:

执行用时:9 ms, 在所有 Java 提交中击败了7.43%的用户

内存消耗:41.7 MB, 在所有 Java 提交中击败了45.39%的用户

    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 num = 0;
        for(int i = 0; i < s.length(); i++){
            int anum = 0;
            if(hasExist(s)){
                StringBuffer stringBuffer = new StringBuffer();
                stringBuffer.append(s.charAt(i));
                if(i + 1 <= s.length() - 1){
                    stringBuffer.append(s.charAt(i+1));
                }
                anum = getInt(stringBuffer.toString());
            }
            if(anum != 0){
                num += anum;
                i += 1;
            }else{
                num += map.get(s.charAt(i));
            }
        }
        return num;
    }

    public int getInt(String s){
        switch(s){
            case "IV":
                return 4;
            case "IX":
                return 9;
            case "XL":
                return 40;
            case "XC":
                return 90;
            case "CD":
                return 400;
            case "CM":
                return 900;
            default:
                return 0;
        }
    }

    public boolean hasExist(String s){
        if(s.contains("IV") || s.contains("IX") || s.contains("XL") || s.contains("XC") || s.contains("CD") || s.contains("CM"))	{
            return true;
        }else{
            return false;
        }
    }
打赏作者
疯子虾夫 微信支付

微信支付

疯子虾夫 支付宝

支付宝

  • 本文作者: 疯子虾夫
  • 本文链接: https://hefengwei.com/archives/leetcode第十三题罗马数字转整数md
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# leetcode
leetcode第九题 回文数
leetcode第一题 两数之和
  • 文章目录
  • 站点概览
疯子虾夫

疯子虾夫

24 日志
5 分类
9 标签
RSS
Creative Commons
© 2025 疯子虾夫
由 Halo 强力驱动
|
主题 - NexT.Mist v5.1.4
赣ICP备2024026242号

粤公网安备 44010602005909号