最重要的思路:设置'CM','CD','XC','XL','IX','IV'的值为实际值减去前一个字母所代表的值,在用字典的get方法时获取当前字母与前一个字母的组合、当前字母对应的value,字典中包含哪个key就返回哪个key(默认先返回第一个key)对应的value。
class Solution(object): def romanToInt(self, s): """ :type s: str :rtype: int """ d = {'M':1000, 'CM':800, 'D':500, 'CD':300, 'C':100, 'XC':80, 'L':50, 'XL':30, 'X':10, 'IX':8, 'V':5, 'IV':3, 'I':1} num = 0 for i,n in enumerate(s): tmpstr = s[max(i-1,0):i+1] num += d.get(tmpstr, d[n]) return num C++编程实现:罗马数字转换为阿拉伯数字的时候,实际上是从左到右将每个字符对应的值累加的过程。例如“XVI”,实际就是10(X)+5(V)+1(I)。
只不过由于存在特殊规则增加了这个过程的复杂,不过同样可以用上面的思路解决。举个例子,“IX”,可以看作是-1+10=9;“XIX”可以看作是10-1+10=19。
题目又告诉我们,通常情况下,罗马数字中小的数字在大的数字的右边。所以,如果s[i]>s[i+1],那s[i]在累加时需要加一个负号,这就完成了特殊规则的处理。
class Solution { public: int romanToInt(string s){ unordered_map<char, int> mp; mp['I'] = 1; mp['V'] = 5; mp['X'] = 10; mp['L'] = 50; mp['C'] = 100; mp['D'] = 500; mp['M'] = 1000; int pos = 0, neg = 0; for (int i = 0;i < s.size()-1;++i){ if (mp[s[i]] < mp[s[i+1]]) neg -= mp[s[i]]; else pos += mp[s[i]]; } pos += mp[s.back()]; return pos + neg; } }; 作者:junex233 链接:https://leetcode-cn.com/problems/roman-to-integer/solution/si-lu-qing-xi-shi-xian-jian-dan-de-fang-fa-by-june/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。