罗马数字转数字

int romanToInt(string s) {
    unordered_map<char, int> mp = {
        {'I', 1},
        {'V', 5},
        {'X', 10},
        {'L', 50},
        {'C', 100},
        {'D', 500},
        {'M', 1000},
    };
    // 从左到右累加当前值,如果当前字符比上一个大,补减上一个值
    int ans = 0;
    for (int i = 0; i < s.size(); i++) {
        ans += mp[s[i]];
        if (i > 0 && mp[s[i]] > mp[s[i-1]]) {
            ans -= 2 * mp[s[i-1]];
        }
    }
    return ans;
}

数字转罗马数字

string intToRoman(int num) {
    const vector<int> radix = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
    const vector<string> symbol = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
    // 贪心法
    ostringstream oss;
    int i = 0;
    while (num) {
        int cnt = num / radix[i];
        num %= radix[i];
        while (cnt) {
            oss << symbol[i];
            cnt--;
        }
        i++;
    }
    return oss.str();
}