Roman To Int

C++

class Solution
{
  public:
    int romanToInt(string s)
    {
        int result = 0;
        for (int i = 0; i < s.length(); i++)
        {
            if (s[i] == 'I')
            {
                if (s[i + 1] == 'V')
                {
                    result = result + 4;
                    i++;
                }
                else if (s[i + 1] == 'X')
                {
                    result = result + 9;
                    i++;
                }
                else
                    result = result + 1;
            }
            else if (s[i] == 'V')
            {
                result = result + 5;
            }
            else if (s[i] == 'X')
            {
                if (s[i + 1] == 'L')
                {
                    result = result + 40;
                    i++;
                }
                else if (s[i + 1] == 'C')
                {
                    result = result + 90;
                    i++;
                }
                else
                    result = result + 10;
            }
            else if (s[i] == 'L')
            {
                result = result + 50;
            }
            else if (s[i] == 'C')
            {
                if (s[i + 1] == 'D')
                {
                    result = result + 400;
                    i++;
                }
                else if (s[i + 1] == 'M')
                {
                    result = result + 900;
                    i++;
                }
                else
                    result = result + 100;
            }
            else if (s[i] == 'D')
            {
                result = result + 500;
            }
            else if (s[i] == 'M')
            {
                result = result + 1000;
            }
        }
        return result;
    }
};

使用unordered_map

class Solution
{
public:
    int romanToInt(string s)
    {
        unordered_map<char, int> T = {
            {'I',1},
            {'V',5},
            {'X',10},
            {'L',50},
            {'C',100},
            {'D',500},
            {'M',1000}
        };
        int result = T[s.back()];
        for (int i = s.length() - 2; i >= 0; i--)
        {
            if (T[s[i]] < T[s[i + 1]])
                result -= T[s[i]];
            else
                result += T[s[i]];
        }
        return result;
    }
};
class Solution
{
public:
    int romanToInt(string s)
    {
        int temp = 0, right = 0, left = 0;
        for (auto c = s.rbegin(); c != s.rend(); c++)
        {
            switch (*c)
            {
            case 'I': left = 1; break;
            case 'V': left = 5; break;
            case 'X': left = 10; break;
            case 'L': left = 50; break;
            case 'C': left = 100; break;
            case 'D': left = 500; break;
            case 'M': left = 1000; break;
            default: break;
            }
            left >= temp ? right += left : right -= left;
            temp = left;
        }
        return right;
    }
};

python

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        transfer_dict = {
            "I": 1,
            "V": 5,
            "X": 10,
            "L": 50,
            "C": 100,
            "D": 500,
            "M": 1000
        }
        result = 0
        i = 0
        n = len(s)
        while i < n:
            if (i + 1 < n) and (transfer_dict[s[i]] < transfer_dict[s[i + 1]]):
                result += transfer_dict[s[i + 1]] - transfer_dict[s[i]]
                i += 2
            else:
                result += transfer_dict[s[i]]
                i += 1
        return result

Last updated

Was this helpful?