13. 罗马数字转整数
给定一个罗马数字,将其转换成整数。
返回的结果要求在 1 到 3999 的范围内。
罗马数字:
罗马数字是阿拉伯数字传入之前使用的一种数码。罗马数字采用七个罗马字母作数字、即Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500)。
记数的方法:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
3、小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
4、在一个数的上面画一条横线,表示这个数增值 1,000 倍
记数的方法:
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如 Ⅲ=3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数,如 Ⅷ=8、Ⅻ=12;
3、小的数字(限于 Ⅰ、X 和 C)在大的数字的左边,所表示的数等于大数减小数得到的数,如 Ⅳ=4、Ⅸ=9;
4、在一个数的上面画一条横线,表示这个数增值 1,000 倍
思路:
使用map存放罗马数字和数字
罗马数字: 当相同数连写 或 小数在大数右边时,直接加,所以一直直接加;
罗马数字: 当相同数连写 或 小数在大数右边时,直接加,所以一直直接加;
当小数在大数左边时,要减去小数,此时因为小数在左边已经加过一次了,所以减去小数的2倍。
代码:
static const auto __ = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return 0;
}();
class Solution {
public:
int romanToInt(string s) {
map<char,int> m;
int result,pos,curr; //curr表示当前数字,pos记录上次数字
m['I']=1;
m['X']=10;
m['C']=100;
m['M']=1000;
m['V']=5;
m['L']=50;
m['D']=500;
pos=m[s[0]];
if(s.size()==1) return pos;
result=pos;
for(int i=1;i<s.size();i++){
curr=m[s[i]];
if(pos<curr)
curr-=2*pos;
result+=curr;
pos=curr;
}
return result;
}
};
