Task:
思路:
- 首先最需要注意的就是把题目读懂,弄懂规则,这里最重要的就是下面的两个信息:
可以看到需要特殊处理的就是I X 和 C 三个字符,他们分别在自己后面的两个数的左边和右边代表着不同的意思,
就拿I和V来说,如果I在V的左边那就是要用V减去I,如果I在V的右边,那就直接是V加上I,
剩下的也是一样的规律
所以,我们需要注意!
- 过度到算法:
上面列出了基本的规则,下面就要过度到算法层面:
可以发现当那三个特殊的I X C如果在另外一个搭档的左边,都是说明这个数要比后面的那个数字小,比如 IV IX 等等,前者都是小的
XL XC也不例外,所以这下可以统一起来了!
如果我们对给定的string s进行遍历,从第一个开始
(1)当前罗马数字对应的整数如果比后一个小,那么结果就等于后者减去前者;
(2)当前罗马数字对应的整数如果比后一个大,那好半,直接给结果加上这个数字就好了!
代码如下:
(1)利用map简历罗马表;
(2)进行判断!
(3)返回结果!
代码:
class Solution {
public:
int romanToInt(string s) {
int result =0; //存放结果
map<char, int> luomab; //简历罗马表
//插入对应的关系
luomab.insert(map<char, int>::value_type('I', 1));
luomab.insert(map<char, int>::value_type('V', 5));
luomab.insert(map<char, int>::value_type('X', 10));
luomab.insert(map<char, int>::value_type('L', 50));
luomab.insert(map<char, int>::value_type('C', 100));
luomab.insert(map<char, int>::value_type('D', 500));
luomab.insert(map<char, int>::value_type('M', 1000));
//遍历
for(int i=0; i<s.length(); i++){
if(luomab[s[i]] >= luomab[s[i+1]])
result += luomab[s[i]];
else{
result += (luomab[s[i+1]] - luomab[s[i]]);
i++;
}
}
return result;
}
};