13. Roman to Integer[E]罗马数字转整数

题目


Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.

思路


在进行罗马数字转化为整数的过程中,由于罗马数字是按照从左往右从大到小的顺序排列,于是可以分析,当左边罗马数字对应的整数A比右边一个罗马数字对应的整数B小的时候,表示B-A。
利用map建立一个罗马数字与整数的对应映射,检查字符串当前字符与下一个字符对应整数的大小关系。
这种建立查找表的题可以通过map来解决。

Tips


Map(C++)

1. 定义
所有元素都是pair,同时拥有键值(key)和实值(value),第一个元素作为键值keymap不允许有相同的键值,第二个值是key对应的value值。key和value可以是任意需要的类型。
2. 构造函数
map<int, string> newMap;
3. 添加数据

map<int, string> newMap;
pair<int , string> add(1,"a");
newMap.insert(add);

for循环(python)

1. 循环定义
for anElement in object:
对象Object是一个集合,可以遍历每一个元素
2. 利用range生成整数序列

  • 三个参数:起始值、终值、步长
    • 起始值如果不提供则默认为0
    • 终值是必须的参数,如果只有一个参数,那么该参数就是终值
    • 步长默认为1,只有提供三个参数时,才有步长值
range(5)
[0, 1, 2, 3, 4]
range(3,8)
[3, 4, 5, 6, 7]
range(1,20,4)
[1, 5, 9, 13, 17]

3. 不能改变变量值
在python中,for循环相当于一个迭代器,在循环体改变循环变量的值对循环次数是没有影响的。因此,对于需要改变变量值的,可以改用while循环。

词典结构(python)

利用查找键值来查找对应的实值

C++

class Solution {
public:
    int romanToInt(string s) {
        map<char, int> table={{'I', 1}, {'V', 5}, {'X',10}, {'L', 50}, {'C',100}, {'D', 500}, {'M', 1000}};
        int resVal = 0;
        
        for(int i= 0; i < s.length(); i++){
            if(i+1 <s.length() && table[s.at(i)] < table[s.at(i+1)]){
                resVal += table[s.at(i+1)] - table[s.at(i)];
                i++;
                continue;
            }
            resVal += table[s.at(i)]; 
        }
        return resVal;
    }
};

Python

 def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        table = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        resInt = 0
        i = 0
        while i < len(s):
            if i > 0 and  table[s[i]] >  table[s[i - 1]]:
                resInt +=  table[s[i]] - 2 *  table[s[i - 1]]
            else:
                resInt +=  table[s[i]]
            i += 1
        return resInt
原文地址:https://www.cnblogs.com/Jessey-Ge/p/10993464.html