罗马数字转整数

分析

这题有点幽默:根据题意直接设置 if-else 条件的运行速度和内存占用比官方解答的要好。 但官方解答也有可取之处: 从左往右的角度看,小的数字位于大的左边,则 ans 减去当前值。 比如 IVIV,因为 I<VI < V,所以我们应该 ans1+5\mathrm{ans} - 1 + 5。 反之则 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;
  }
};
返回文章列表