# 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