1. 程式人生 > >【LeetCode013演算法/程式設計練習C++】Roman to Integer //難得擊敗了80%的人

【LeetCode013演算法/程式設計練習C++】Roman to Integer //難得擊敗了80%的人

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

---------------------------------第一次覺得自己這次程式碼很簡潔-------------------------------

時間複雜度O(n),參照12題(見下)逆向的Top Solution,得出規律——只要處理好CD,CM,XL,XC,IV,IX這幾個之後其他的按單個的累加即可。

//    String M[] = {"", "M", "MM", "MMM"};  
//    String C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"};  
//    String X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"};  
//    String I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; 

if(i+1<s.size()&&(s[i+1]=='D'||s[i+1]=='M'))程式碼裡的i+1<s.size()部分會提升很多速率…………

//本來以為去掉會提速的,結果並沒有

class Solution {
public:
    int romanToInt(string s) {
    int result=0;
    for(int i=0;i<s.size();i++){
        switch(s[i]){
            case 'M':result+=1000;break;
            case 'D':result+=500;break;
            case 'C':if(i+1<s.size()&&(s[i+1]=='D'||s[i+1]=='M'))result-=100;else result+=100;break;
            case 'L':result+=50;break;
            case 'X':if(i+1<s.size()&&(s[i+1]=='L'||s[i+1]=='C'))result-=10;else result+=10;break;
            case 'V':result+=5;break;
            case 'I':if(i+1<s.size()&&(s[i+1]=='V'||s[i+1]=='X'))result-=1;else result+=1;break;
        }
    }
    return result;
    }

};

執行結果:


難得一次擊敗了80%+的人,mark一下

祝刷題愉快~