题目链接:13. 罗马数字转整数 - 力扣(LeetCode)
普通版本(模拟)
分析:通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,累加每个字符对应的数值即可(XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27);若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字(XIV 可视作 X−I+V=10−1+5=14)
结论:当前位置表示的元素的值 < 下个位置表示的元素的值,就用总数减去当前位置的值(小的在左),否则总数加上当前位置的值(小的在右)
class Solution {
private:unordered_map<char, int> symbolValues = {{'I', 1},{'V', 5},{'X', 10},{'L', 50},{'C', 100},{'D', 500},{'M', 1000},};public:int romanToInt(string s) {int ans = 0;//最终结果int n = s.length();for (int i = 0; i < n; ++i) {int value = symbolValues[s[i]];//value表示当前位置上的字符,[]返回值是键对应的值的引用if (i < n - 1 && value < symbolValues[s[i + 1]])//前一个字符和后一个字符进行比较,因此i表示的位置不能是n-1{ans -= value;//当前位置的元素比下个位置的元素小,就减去当前值,否则加上当前值}else {ans += value;}}return ans;}
};
时间复杂度:O(N)
空间复杂度:O(1)
注意事项:记得查看unordered_map的使用方式,[]的传入值与返回值,unordered_map的初始化及插入方式C++的map和set-CSDN博客
~over~