題目直接截圖於力扣(LeetCode)。算法
該題網址:https://leetcode-cn.com/problems/roman-to-integer/函數
題很簡單,貌似沒用到什麼複雜的算法。spa
觀察羅馬數字的寫法,能夠獲得一個很簡單的規律:當前一個數字的值比後一個數字大時,直接將兩個數加起來,不然先減去前一個數,而後再加上當前數-前一個數的值...就這樣一直到字符串結束,最後返回相加的結果便可。指針
1 int getInt(char c) // 獲取字符對應的整數 2 { 3 int r; 4 switch(c) 5 { 6 case 'I': r = 1; break; 7 case 'V': r = 5; break; 8 case 'X': r = 10; break; 9 case 'L': r = 50; break; 10 case 'C': r = 100; break; 11 case 'D': r = 500; break; 12 case 'M': r = 1000; break; // 給的通常都是符合要求的,不用考慮那些異常狀況。 13 } 14 return r; 15 } 16 17 int romanToInt(char * s){ 18 int len = strlen(s); // 獲取字符指針的長度,也能夠本身寫一個函數,但速度會降低一點。 19 if(len == 0) 20 { 21 return 0; 22 } 23 int i; 24 int n; 25 int r = getInt(s[0]); 26 for(i = 1; i < len; i++) 27 { 28 if(getInt(s[i-1]) >= getInt(s[i])) // 判斷前一個當前數字和前一個數字那個數字大,若是前一個數字大於其後的數字,直接相加值。 29 { 30 r += getInt(s[i]); 31 } 32 else // 不然先減去前一個數字,而後再加上【當前數字減去前一個數字】的值。 33 { 34 r -= getInt(s[i-1]); 35 n = getInt(s[i]) - getInt(s[i-1]); 36 r += n; 37 } 38 } 39 return r; 40 }