roman-to-integer

Roman to Integer – LeetCode 13

Problem

Description

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

Answer

Original

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public:
int romanToInt(string s) {
vector<int> convert;
for(auto &si: s){
switch(si){
case 'I': convert.push_back(1); break;
case 'X': convert.push_back(10); break;
case 'C': convert.push_back(100); break;
case 'M': convert.push_back(1000); break;
case 'V': convert.push_back(5); break;
case 'L': convert.push_back(50); break;
case 'D': convert.push_back(500); break;
}
}
if(convert.size() == 1) return convert[0];
vector<int> sign(convert.size(),1);
if(convert[0] < convert[1]) sign[0] = -1;
for(int i = 1; i != convert.size() - 1; ++i){
if((convert[i] < convert[i+1]) ) sign[i] = -1;
}
int sum = 0;
for(int i = 0; i != convert.size(); ++i)
sum += sign[i] * convert[i];
return sum;
}
};

思路

要求将罗马数字转换成数字,难点在于在大数字的左右,小数字可能是正的也可能是负的。这个版本从头向尾解析,选择使用两个vector分别记录值和正负符号。最后加和汇总,思路同样很直接。时间复杂度$O(n)$,空间复杂度$O(n)$。
耗时$82$ ms,排名$53.18\%$。

Better

思路

这个版本不变思路,选择从尾向头进行解析,这样就可以在得到符号的同时直接求和,避免了vector创建等等的时间消耗。同样的,时间复杂度$O(n)$,空间复杂度$O(n)$。
耗时$52$ ms,排名$9.85\%$。
LeetCode平台测试得到的结果时长依旧有波动。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
int romanToInt(string s) {
int now, prev = 0, sum = 0;
for(int i = s.size() - 1; i >= 0; --i){
switch(s[i]){
case 'I': now = 1; break;
case 'X': now = 10; break;
case 'C': now = 100; break;
case 'M': now = 1000; break;
case 'V': now = 5; break;
case 'L': now = 50; break;
case 'D': now = 500; break;
}
if(now < prev) sum -= now;
else sum += now;
prev = now;
}
return sum;
}
};