zoukankan      html  css  js  c++  java
  • LeetCode 5.罗马数字转整数

    题目描述

    题目难度:简单

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

    示例 1:

    输入: "III"
    输出: 3


    示例 2:

    输入: "IV"
    输出: 4


    示例 3:

    输入: "IX"
    输出: 9


    示例 4:

    输入: "LVIII"
    输出: 58
    解释: L = 50, V= 5, III = 3.
    示例 5:

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

    解题思路

    首先建立一个HashMap来映射符号和值,然后对字符串从右到左遍历,

    如果相邻两个字母的值为特殊值,则加上这个特殊值;

    如果相邻两个字母的值不为特殊值,则加上这个字母对应的值;

    最后就可以得出结果了

    这道题主要就是要主要边界问题

    避免报错: java.lang.StringIndexOutOfBoundsException: begin 2, end 4, length 3

    代码如下

    package leetcode;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class RomanToInt {
          public int romanToInt(String s) {
            Map<String, Integer> map=new HashMap<String, Integer>();
            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 result=0;
            if (s.length()==1) {
                result+=map.get(s);
            }else {
                for (int i = s.length()-1; i >=0; i--) {
                    if (i-1>=0&&s.substring(i-1, i+1).equals("IV")) {
                        result+=4;
                        i--;
                    }else if (i-1>=0&&s.substring(i-1, i+1).equals("IX")) {
                        result+=9;
                        i--;
                    }else if (i-1>=0&&s.substring(i-1, i+1).equals("XL")) {
                        result+=40;
                        i--;
                    }else if (i-1>=0&&s.substring(i-1, i+1).equals("XC")) {
                        result+=90;
                        i--;
                    }else if (i-1>=0&&s.substring(i-1, i+1).equals("CD")) {
                        result+=400;
                        i--;
                    }else if (i-1>=0&&s.substring(i-1, i+1).equals("CM")) {
                        result+=900;
                        i--;
                    }else {
                        result+=map.get(s.charAt(i)+"");
                    }
                    
                }
            }
            
    
              return result;
    
            }    
          //测试代码
          public static void main(String[] args) {
            RomanToInt romanToInt=new RomanToInt();
            int result=romanToInt.romanToInt("IV");
            System.out.println(result);
        }
    }

     

  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/Transkai/p/12366339.html
Copyright © 2011-2022 走看看