zoukankan      html  css  js  c++  java
  • Roman to Integer

    题目链接

    Roman to Integer - LeetCode

    注意点

    • 大的数字在小的数字左边是正常情况,要考虑的是小的数字在大的数字右边的那8种情况

    解法

    解法一:从右至左,对于出现的每个字符逐个判断,累加。时间复杂度为O(n)

    class Solution {
    public:
        int romanToInt(string s) {
            int i,n = s.size(),anw = 0;
            for(i = n-1;i >= 0;i--)
            {
                if(s[i] == 'M')
                {
                    if(s[i-1] == 'C')
                    {
                        anw += 900;
                        i--;
                    }
                    else
                    {
                        anw += 1000;
                    }
                }
                else if(s[i] == 'D')
                {
                    if(s[i-1] == 'C')
                    {
                        anw += 400;
                        i--;
                    }
                    else
                    {
                        anw += 500;
                    }
                }
                else if(s[i] == 'C')
                {
                    if(s[i-1] == 'X')
                    {
                        anw += 90;
                        i--;
                    }
                    else
                    {
                        anw += 100;
                    }
                }
                else if(s[i] == 'L')
                {
                    if(s[i-1] == 'X')
                    {
                        anw += 40;
                        i--;
                    }
                    else
                    {
                        anw += 50;
                    }
                }
                else if(s[i] == 'X')
                {
                    if(s[i-1] == 'I')
                    {
                        anw += 9;
                        i--;
                    }
                    else
                    {
                        anw += 10;
                    }
                }
                else if(s[i] == 'V')
                {
                    if(s[i-1] == 'I')
                    {
                        anw += 4;
                        i--;
                    }
                    else
                    {
                        anw += 5;
                    }
                }
                else if(s[i] == 'I')
                {
                    anw += 1;
                }
                //printf("%d
    ",anw);
            }
            return anw;
        }
    };
    

    解法二:从左至右。如果之前的数字小于当前的就减去之前的数字,否则就加上。最后一个字符无论如何都加上。时间复杂度O(n)

    class Solution {
    public:
        int romanToInt(string s) {
            map<char,int> m;
            m['I'] = 1;
            m['V'] = 5;
            m['X'] = 10;
            m['L'] = 50;
            m['C'] = 100;
            m['D'] = 500;
            m['M'] = 1000;
            int i,n = s.size(),anw = 0;
            int before = m[s[0]],now = 0;
            for(i = 1;i < n;i++)
            {
                now = m[s[i]];
                if(before < now)
                {
                    anw -= before;
                }
                else
                {
                    anw += before;
                }
                before = now;
            }
            anw += before;
            return anw;
        }
    };
    

    小结

    • 理解了罗马数字的原理这题就不难
  • 相关阅读:
    ETL开发
    ETL 运行维护
    软件开发的核心
    索引的本质
    也谈谈学习
    oracle内部结构
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher H
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher :G
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher F
    [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher E
  • 原文地址:https://www.cnblogs.com/multhree/p/10320230.html
Copyright © 2011-2022 走看看