zoukankan      html  css  js  c++  java
  • 12 13-int与罗马数字转换

    题目一:

    将int转换为罗马数字:

    罗马数字包含以下七种字符: 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:

    输入: 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.

    代码:

    string intToRoman(int num) 
    {
        if (num <= 0)
            return "";
        string str = "";
        int numArray[] = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
        string romanArray[] = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
    
        int i = 0;
        while (i < 13)
        {
            if (num >= numArray[i])
            {
                str += romanArray[i];
                num -= numArray[i];
            }
            else
                i++;
        }
        
        return str;
    }

    题目二:罗马数字转int

    代码一:查询单个字符、两个字符的罗马数字,分两种情况:

    int romanToInt(string s) 
    {
        if (s == "")
            return 0;
    
        unordered_map<string,int> map = 
        {
            { "M", 1000 },
            { "CM", 900 },
            { "D", 500 },
            { "CD", 400 },
            { "C", 100 },
            { "XC", 90 },
            { "L", 50 },
            { "XL", 40 },
            { "X", 10 },
            { "IX", 9 },
            { "V", 5 },
            { "IV", 4 },
            { "I", 1 }
        };
    
        int val = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (i + 1 < s.length())        //先找长度为2的,看能够找到
            {
                string tmp = { s[i], s[i+1] };
                if (map.count(tmp) > 0)
                {
                    val += map[tmp];
                    i += 1;
                    continue;
                }
            }
            /*if (map.count(s[i] + "")>0)
                val += map[s[i]+""];*/
            if (map.count({ s[i] }) > 0)
                val += map[{s[i]}];
        }
    
        return val;
    }

    优化:

    -- 对于两位字符的可以这样理解:CM:C出现在M左侧则为M-C=1000-100=900,判断当前字符的值是否大于上一个字符

    int romanToInt2(string s)
    {
        if (s == "")
            return 0;
        //对于两位字符的可以这样理解:CM:C出现在M左侧则为M-C=1000-100=900
        //判断当前字符的值是否大于上一个字符
        unordered_map<string, int> map =
        {
            { "M", 1000 },
            //{ "CM", 900 },
            { "D", 500 },
            //{ "CD", 400 },
            { "C", 100 },
            //{ "XC", 90 },
            { "L", 50 },
            //{ "XL", 40 },
            { "X", 10 },
            //{ "IX", 9 },
            { "V", 5 },
            //{ "IV", 4 },
            { "I", 1 }
        };
    
        int val = 0;
        int lastVal = 0;
    
        for (int i = 0; i < s.length(); i++)
        {
            //if (map.count({ s[i] }) > 0)
            //{
                int tmp = map[{s[i]}];
                if (tmp > lastVal)
                    val -= (2 * lastVal);
                
                val += tmp;
                lastVal = tmp;
            //}
        }
    
        return val;
    }
  • 相关阅读:
    UVA 10391 STL容器的使用
    UVA 10763
    UVA 10935
    UVA 洪水
    UVA 1594 set 里面放queue
    关于STL 容器的嵌套使用, 小试牛刀
    丑数 UVA 136
    UVA 1368 DNA
    antd 上传文件控件使用方法(坑)
    mysql查询一条工单时间需要10秒。优化sql语句得以解决。
  • 原文地址:https://www.cnblogs.com/zyk1113/p/13958300.html
Copyright © 2011-2022 走看看