1. 程式人生 > >Leetcode 13題 羅馬數字轉換為整形

Leetcode 13題 羅馬數字轉換為整形

Given a roman numeral, convert it to an integer.

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

查了下羅馬數字的進位制與表示規律。
首先是進位制
Roman numerals ( 羅馬數字 ) :
I = 1
V = 5
X =10
L = 50
C = 100
D = 500
M = 1000
規律
III = 1+1+1=3
IV = 5-1=4
VI = 5+1=6
IX = 10-1=9
XI = 10+1=11
XXI = 10+10+1=21
LXX=50+10+10=70
LXXX=80
XC=100-10=90
,,,,,,,,,,,,
如此,總結一下,數字表示從左往右數按照權值從大到小排列,跟阿拉伯數字規律差不多,區別是同樣的數字只能連續出現3次,當表示4或者9的時候,需要將小權重的數字如X(10)放在大權重數字C(100)前,做減法。

好了,知道進位制與表示規律後,這題思路簡單,宣告一個結構體,在其中存放權值與對應符號,然後對輸入的羅馬字串一一匹配,累加即可。只是在碰到表示4或9及其他們的10倍、100倍等時候要進行判定,特殊處理。

程式碼如下:
class Solution {
public:
int romanToInt(string s) {
typedef struct romanWeight
{
char ch;
int val;
}romanWight;

romanWight weight[] =
{
{‘I’, 1}, {‘V’, 5}, {‘X’, 10}, {‘L’, 50}, {‘C’, 100}, {‘D’, 500}, {‘M’, 1000}
};

//預設輸入的羅馬數字符合規定,就不進行正確性檢查了
int n = s.size();
int sum=0, w=1000;
//w記錄每一位的權重,當發現查詢的val>w時,就倒回去,變成負數,或者直接減去兩倍之前的小權的數

// for( auto i=s.begin(); i != s.end(); ++i )
for( int i=0; i < n; ++i)
{
//指標p用來查尋權值,每次迴圈後都回到初始地方
romanWeight *p = &weight[0];
while( s[i] != p->ch )
++p;
if( w < p->val ) //出現形成4或9的情況
sum = sum + p->val - w - w;
else
sum = sum + p->val;
w = min(p->val, w);
}

return sum;
}
};