Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
http://oj.leetcode.com/problems/roman-to-integer/
Solution:
First thing is to have function that convert roman char to int. They are I->1, V->5, X->10, L->50, C->100, D->500, M->1000.
And there are two rules in writing roman numbers. First is to simply add the char. Another is subtraction like 4 in roman number is IV which means V-I.
So let's see what happen in 1~10, which are I, II, III, IV, V, VI, VIII, IX and X. It seems we find some laws in it.
If s[i] > s[i-1], we can simply add the numer, else we need to add (s[i] - s[i-1]). And since we have already added s[i-1] before, we need to subtract s[i] + 2 * s[i-1].
https://github.com/starcroce/leetcode/blob/master/roman_to_int.cpp
// 304 ms for 3999 test cases
class Solution {
public:
int romanToInt(string s) {
// Note: The Solution object is instantiated only once and is reused by each test case.
int ans = 0;
for(int i = 0; i < s.size(); i++) {
// like IV
if(i > 0 && charToInt(s[i]) > charToInt(s[i-1])){
ans += charToInt(s[i]) - 2 * charToInt(s[i-1]);
}
else {
ans += charToInt(s[i]);
}
}
return ans;
}
int charToInt(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;
}
}
};
298

被折叠的 条评论
为什么被折叠?



