我的思路:
遍历一遍,遇到相应字符,查看下一个字符,确定值,加和。
class Solution {
public:
int romanToInt(string s) {
int sum = 0;
for(int i = 0; i < s.length(); ){
switch (s[i]){
case 'I':
if(s[i+1] == 'V') {sum+=4; i+=2;}
else if(s[i+1] == 'X') {sum+=9; i+=2;}
else {sum+=1; i++;}
break;
case 'V':
sum+=5; i++;
break;
case 'X':
if(s[i+1] == 'L') {sum+=40; i+=2;}
else if(s[i+1] == 'C') {sum+=90; i+=2;}
else {sum+=10; i++;}
break;
case 'L':
sum+=50; i++;
break;
case 'C':
if(s[i+1] == 'D') {sum+=400; i+=2;}
else if(s[i+1] == 'M') {sum+=900; i+=2;}
else {sum+=100; i++;}
break;
case 'D':
sum += 500; i++;
break;
case 'M':
sum+=1000; i++;
break;
default:
break;
}
}
return sum;
}
};
执行用时 : 40 ms, 在Roman to Integer的C++提交中击败了96.73% 的用户
内存消耗 : 8.3 MB, 在Roman to Integer的C++提交中击败了94.31% 的用户
思路直接,效果一般。
其他人的思路
LeetCode用户脆皮炸鸡的LeetCode题后评论解法。
int romanToInt(char* s) {
static int hash[128];
hash['I'] = 1;
hash['V'] = 5;
hash['X'] = 10;
hash['L'] = 50;
hash['C'] = 100;
hash['D'] = 500;
hash['M'] = 1000;
int result = 0;
while(*s != 0) {
if (hash[*s] < hash[*(s+1)])
result -= hash[*s++];
else
result += hash[*s++];
}
return result;
}
1 简洁很棒。
2 字符映射很棒。
3 简化了情况的考虑(但可能也存在问题,如IC)。