罗马数字转阿拉伯数字,以前没有做过这题,但是可能有类似的做过,主要注意的地方:
思路:
分段处理罗马数字,然后将每个段的值相加
其中:
判断如果当前位所指的字符代表的数值等于上一位,则将当前位所指的字符代表的数值添加进用来保存分段值的temp;
判断如果当前位所指的字符代表的数值大于上一位,则用当前位所指的字符代表的数值减去上一位,存入用来保存分段值的temp;
判断如果当前位所指的字符代表的数值小于上一位,则将目前的result添加进用来保存逐段和的result,然后重新开始记录分段值temp(将当前位所指的字符代表的数值赋给temp)
需要注意:
1、罗马数字第一个字符可以直接先赋给分段值temp
2、特点罗马符号需要设定成特定值,不然会按照ACSII码判断
c++代码如下:
class Solution {
public:
static int singleRomanToInt(char c) {
switch (c) {
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return 0;
}
}
int romanToInt(string s) {
int result = 0;
int temp = 0;
int n = s.size();
temp = singleRomanToInt(s[0]);
for (int i = 1; i < n; i++) {
if (singleRomanToInt(s[i]) == singleRomanToInt(s[i - 1])) {
temp += singleRomanToInt(s[i]);
}
else if(singleRomanToInt(s[i]) > singleRomanToInt(s[i - 1]))
{
temp = singleRomanToInt(s[i]) - temp;
}
else if (singleRomanToInt(s[i]) < singleRomanToInt(s[i - 1])) {
result += temp;
temp = singleRomanToInt(s[i]);
}
}
result += temp;
return result;
}
};