分析
这题有点幽默:根据题意直接设置 if-else 条件的运行速度和内存占用比官方解答的要好。
但官方解答也有可取之处:
从左往右的角度看,小的数字位于大的左边,则 ans
减去当前值。
比如 ,因为 ,所以我们应该 。
反之则 ans += val
。
解答
class Solution {public: int romanToInt(string s) { unordered_map<char, int> symbol_values = { {'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}}; auto ans = 0; auto n = s.length();
for (auto i = 0; i < n; ++i) { auto val = symbol_values[s[i]]; if (i < n - 1 && val < symbol_values[s[i + 1]]) ans -= val; else ans += val; }
return ans; }};