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();
}