【LeetCode013演算法/程式設計練習C++】Roman to Integer //難得擊敗了80%的人
阿新 • • 發佈:2018-12-24
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一下
祝刷題愉快~