Leetcode算法课程第七周作业
13. Roman to Integer
题目描述:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
给定一个罗马数字,把它转变成一个整型,罗马数字的范围在1到3999
题目分析
首先罗马数字有7个符号
I — 1
V — 5
X — 10
L — 50
C — 100
D — 500
M — 1000
罗马数字有两个特点
一个数字重复出现几次就是这个数的几的倍数
右加左减原则: 一个较大的数的右边放一个小的数,就是这两个数的和,否则就是两个数的差。
给定任意一个罗马数字,我们从最后一个字符开始,向左边方向依次比较当前字符和相邻字符的相对大小,如果满足右加,则result加上当前字符对应的十进制值,如果满足左减,则result减去当前值
class Solution {
public:
int romanToInt(string s) {
map<char, int> roman;
roman.insert(pair<char, int>('I', 1));
roman.insert(pair<char, int>('V', 5));
roman.insert(pair<char, int>('X', 10));
roman.insert(pair<char, int>('L', 50));
roman.insert(pair<char, int>('C', 100));
roman.insert(pair<char, int>('D', 500));
roman.insert(pair<char, int>('M', 1000));
int len = s.size();
int result = roman[s[len - 1]];
int pivot = result;
for (int i = len - 2; i >= 0; i--) {
int curr = roman[s[i]];
if (curr < pivot) { //左减
result -= curr;
} else {
result += curr;
}
pivot = curr;
}
return result;
}
};