Leetcode 12 Solution

This article provides solution to leetcode question 12 (integer-to-roman)

https://leetcode.com/problems/integer-to-roman

Thinking Process

The challenge part of this question is these three rules:

  • I can be placed before V (5) and X (10) to make 4 and 9.
  • X can be placed before L (50) and C (100) to make 40 and 90.
  • C can be placed before D (500) and M (1000) to make 400 and 900.

You can definitely write special logic to handle them. But a much simpler way would be to include them in the symbol list:

Symbol       Value
I             1
IV            4
V             5
IX            9
X             10
XL            40
L             50
XC            90
C             100
CD            400
D             500
CM            900
M             1000

After that, we can just try to grab the largest symbol from the list to make the target number. For example, if the target number is 45, we grab a XL first, and then 5 is left, we grab a V. The result is XLV.

Time & Space Complexity

Assuming N is the bit length of the input number

  • Time complexity: O(n)
  • Space complexity: O(1)

Solution

class Solution {
public:
    string intToRoman(int num) {
        vector<pair<int, string>> a;
        a.push_back(make_pair(1000, "M"));
        a.push_back(make_pair(900, "CM"));
        a.push_back(make_pair(500, "D"));
        a.push_back(make_pair(400, "CD"));
        a.push_back(make_pair(100, "C"));
        a.push_back(make_pair(90, "XC"));
        a.push_back(make_pair(50, "L"));
        a.push_back(make_pair(40, "XL"));
        a.push_back(make_pair(10, "X"));
        a.push_back(make_pair(9, "IX"));
        a.push_back(make_pair(5, "V"));
        a.push_back(make_pair(4, "IV"));
        a.push_back(make_pair(1, "I"));

        string res;
        while (num)
        {
            for (int i = 0; i < a.size(); i++)
            {
                int cnt = num / a[i].first;
                if (cnt == 0)
                    continue;

                for (int j = 0; j < cnt; j++)
                    res += a[i].second;
                num -= cnt * a[i].first;
                break;
            }
        }

        return res;
    }
};