zoukankan      html  css  js  c++  java
  • [LeetCode] 12,13 整数和罗马数互转

    12. 整数转罗马数字

    题目链接:https://leetcode-cn.com/problems/integer-to-roman/

    题目描述:

    罗马数字包含以下七种字符: IVXLCDM

    字符          数值
    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:

    输入: 3
    输出: "III"
    

    示例 2:

    输入: 4
    输出: "IV"
    

    示例 3:

    输入: 9
    输出: "IX"
    

    示例 4:

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

    示例 5:

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

    思路:

    用哈希,直接看代码很好理解

    关注知乎专栏,了解更多解题技巧.

    代码:

    python

    class Solution:
        def intToRoman(self, num: int) -> str:
            lookup = {
                1:'I',
                4:'IV',
                5:'V',
                9:'IX',
                10:'X',
                40:'XL',
                50:'L',
                90:'XC',
                100:'C',
                400:'CD',
                500:'D',
                900:'CM',
                1000:'M'     
            }
            res = ""
            for key in sorted(lookup.keys())[::-1]:
                a = num // key
                if a == 0:
                    continue
                res += (lookup[key] * a)
                num -= a * key
                if num == 0:
                    break
            return res
    

    java

    class Solution {
        public String intToRoman(int num) {
            //用数组定义字典
            int[] values={1000,900,500,400,100,90,50,40,10,9,5,4,1}; 
            String[] strs={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
            
            //定义一个字符串
            StringBuilder res = new StringBuilder();
            
            for(int i = 0; i <values.length; i ++){
                int a = num / values[i];
                if(a==0)continue;
                for(int j = a; j > 0;j --)
                    res.append(strs[i]);
                num -= (a*values[i]);
                if(num ==0)break;
            }
            return res.toString();
            
        }
    }
    

    C++

    class Solution {
    public:
        string intToRoman(int num) {
            vector<int> values={1000,900,500,400,100,90,50,40,10,9,5,4,1}; 
            vector<string> strs={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
            string res;
            for(int i = 0; i < values.size(); i++){
                while(num >= values[i]){
                    res += strs[i];
                    num -= values[i];
                }
            }
            return res;
            
        }
        
    };
    

    13. 罗马数字转整数

    题目链接:https://leetcode-cn.com/problems/roman-to-integer/

    题目描述:

    罗马数字包含以下七种字符: IVXLCDM

    字符          数值
    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.
    

    思路:

    看代码很好理解.

    关注知乎专栏,了解更多解题技巧.

    代码:

    python

    class Solution:
        def romanToInt(self, s: str) -> int:
            lookup = {
                "I":1,
                "IV":4,
                "V":5,
                "VI":6,
                "IX":9,
                "X":10,
                "XL":40,
                "L":50,
                "XC":90,
                "C":100,
                "CD":400,
                "D":500,
                "CM":900,
                "M":1000, 
            }
            n = len(s)
            i = 0
            res = 0
            while i < n:
                if i < n - 1 and s[i:i+2] in lookup:
                    res += lookup[s[i:i+2]]
                    i += 2
                elif s[i] in lookup:
                    res += lookup[s[i]]
                    i += 1
            return res
    

    java

    class Solution {
        public int romanToInt(String s) {
            HashMap<String, Integer> map = new HashMap<String, Integer>();
            map.put("I", 1);
            map.put("IV", 4);
            map.put("V",5);
            map.put("VI",6);
            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;
            int i = 0;
            int n = s.length();
            while (i < n) {
                if (i < n - 1 && map.containsKey(s.substring(i, i + 2))) {
                    res += map.get(s.substring(i, i + 2));
                    i += 2;
                } else if (map.containsKey(s.substring(i, i + 1))) {
                    res += map.get(s.substring(i, i + 1));
                    i += 1;
    
                }
            }
            return res;
            
        }
    }
    
  • 相关阅读:
    ES6 promise的用法
    elementUI el-dialog 解决embed标签无法实时更新预览PDF文件
    elementUI upload 上传 传参
    elementUI form表单验证
    Ajax 原理过程 同步与异步区别 优缺点
    《深入理解mybatis原理(十二)》 mybatis深入理解之#与$区别
    截取字符串,含有汉字和字母,不能截半个汉字
    输出一个纯英文字符串中出现次数最左的单词和次数,如果有几个次数最多的单词,全部输出
    极简主义生活方式
    MySQL中创建表指定存储引擎
  • 原文地址:https://www.cnblogs.com/powercai/p/10750946.html
Copyright © 2011-2022 走看看