zoukankan      html  css  js  c++  java
  • 剑指Offer 13. 罗马数字转整数

    1. 题目

    罗马数字包含以下七种字符: I, V, X, LCD 和 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。
    给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

    2. 示例

    示例1:

    输入: "III"
    输出: 3

    示例2:

    输入: "IV"
    输出: 4

    示例3:

    输入: "MCMXCIV"
    输出: 1994
    解释: M = 1000, CM = 900, XC = 90, IV = 4.

    3. 题解

    这道题很明显使用HashMap来解决。

     1     HashMap<String, Integer> map = new HashMap<>();
     2     map.put("M", 1000);
     3     map.put("CM", 900);
     4     map.put("D", 500);
     5     map.put("CD", 400);
     6     map.put("C", 100);
     7     map.put("XC", 90);
     8     map.put("L", 50);
     9     map.put("XL", 40);
    10     map.put("X", 10);
    11     map.put("IX", 9);
    12     map.put("V", 5);
    13     map.put("IV", 4);
    14     map.put("I", 1);        

    发现,键里面最多为两位长度,所以只要判断hash表里是否包含2位和1位即可。

    4. 实现

     1 public class RomanToInt13 {
     2     public int romanToInt(String s) {
     3         HashMap<String, Integer> map = new HashMap<>();
     4         map.put("M", 1000);
     5         map.put("CM", 900);
     6         map.put("D", 500);
     7         map.put("CD", 400);
     8         map.put("C", 100);
     9         map.put("XC", 90);
    10         map.put("L", 50);
    11         map.put("XL", 40);
    12         map.put("X", 10);
    13         map.put("IX", 9);
    14         map.put("V", 5);
    15         map.put("IV", 4);
    16         map.put("I", 1);
    17 
    18         int ans = 0;
    19         for(int i = 0; i < s.length(); i++) {
    20             if(i + 1 < s.length() && map.containsKey(s.substring(i, i +2))) {
    21                 ans += map.get(s.substring(i, i + 2));
    22                 i++;
    23             } else {
    24                 ans += map.get(s.substring(i, i+1));
    25             }
    26         }
    27         return ans;
    28     }
    29 
    30     public static void main(String[] args) {
    31         String s = "LVIII";
    32         System.out.println(new RomanToInt13().romanToInt(s));
    33     }
    34 }

    5. 结语

      努力去爱周围的每一个人,付出,不一定有收获,但是不付出就一定没有收获! 给街头卖艺的人零钱,不和深夜还在摆摊的小贩讨价还价。愿我的博客对你有所帮助(*^▽^*)(*^▽^*)!

      如果客官喜欢小生的园子,记得关注小生哟,小生会持续更新(#^.^#)(#^.^#)。

    但行好事 莫问前程
  • 相关阅读:
    Spring HandlerInterceptor的使用
    JAVE 视音频转码
    习课的redis配置记录
    原 HttpClient 4.3超时设置
    IPMI
    Tomcat redis 配置
    JVM route
    linux swap空间的swappiness=0
    【SSH三大框架】Hibernate基础第五篇:利用Hibernate完毕简单的CRUD操作
    英特尔高速存储技术
  • 原文地址:https://www.cnblogs.com/haifwu/p/14942088.html
Copyright © 2011-2022 走看看