# 13 - Roman to Integer
解法一 - 處理各種 case
這種作法應該是最直覺的,實作如下:
class Solution {
public:
int romanToInt(string s) {
int res = 0;
for(int i=0; i<s.length(); i++) {
if(s[i] == 'I') {
if(i == s.length()-1) res++;
else if(s[i+1] == 'V') { res += 4; i++; }
else if(s[i+1] == 'X') { res += 9; i++;}
else res++;
}
else if(s[i] == 'V') res += 5;
else if(s[i] == 'X') {
if(i == s.length()-1) res += 10;
else if(s[i+1] == 'L') { res += 40; i++; }
else if(s[i+1] == 'C') { res += 90; i++;}
else res += 10;
}
else if(s[i] == 'L') res += 50;
else if(s[i] == 'C') {
if(i == s.length()-1) res += 100;
else if(s[i+1] == 'D') { res += 400; i++; }
else if(s[i+1] == 'M') { res += 900; i++;}
else res += 100;
}
else if(s[i] == 'D') res += 500;
else if(s[i] == 'M') res += 1000;
}
return res;
}
};
解法二 - 扣除法
我們也可以把所有的數字先一股腦地加起來,最後再減掉所有多出來的值。實作如下:
class Solution {
public:
int romanToInt(string s) {
int res = 0;
for(int c=0; c<s.length(); c++){
if(s[c]=='M') res+=1000;
if(s[c]=='D') res+=500;
if(s[c]=='C') res+=100;
if(s[c]=='L') res+=50;
if(s[c]=='X') res+=10;
if(s[c]=='V') res+=5;
if(s[c]=='I') res+=1;
}
if(s.find("IV") != string::npos) res -= 2;
if(s.find("IX") != string::npos) res -= 2;
if(s.find("XL") != string::npos) res -= 20;
if(s.find("XC") != string::npos) res -= 20;
if(s.find("CD") != string::npos) res -= 200;
if(s.find("CM") != string::npos) res -= 200;
return res;
}
};
因為上面的 special case 在一個羅馬數字中頂多也只會出現一次,所以都只需要用一次 if 判斷每個 case 就好。
Last updated