leetcode No.13 罗马数字转整数
思路(官方题解):
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
例如 XXVII 可视作 X+X+V+I+I=10+10+5+1+1=27。
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
int getValue(char ch) {
switch(ch) {
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(char * s){
int sum = 0;
int num_bef = 0;
int num_aft = 0;
int i;
for (i = 1, num_bef = getValue(s[0]); i < strlen(s); i++) {
num_aft = getValue(s[i]);
if (num_bef >= num_aft) {
sum += num_bef;
}
else {
sum -= num_bef;
}
num_bef = num_aft;
}
sum += num_bef;
return sum;
}