leetcode 13: Roman to Integer
覺得版面太空趕快先寫一題來灌個水,經典的羅馬數字轉阿拉伯數字(連結) 基本上這題就是找出羅馬數字的規則,其實就兩點
- 符號的值由左向右遞減
- 左減右加,如果一個比較小的值被放在左邊就會是減,像是
IV
裡面的I
因為放在V
的左邊,就代表減一
所以只要將得到的字串,由左向右掃描一遍,並且比較相鄰元素的值就可以得到答案了 所以可以寫出如下code:
#include <string.h>
const char* r = "IVXLCDM";
const int v[] = {1, 5, 10, 50, 100, 500, 1000};
int get_value(char c)
{
for(int i=0 ; i<7 ; i++)
if(r[i]==c) return v[i];
return -1;
}
int romanToInt(char* s)
{
int l = strlen(s);
int ret = 0;
int n, o = get_value(s[0]);
for(int i=1 ; i<l ; i++)
{
n = get_value(s[i]);
if(n > o)
ret -= o;
else
ret += o;
o = n;
}
return ret + o;
}
最後ret可以直接加上o是因為,它已經在字串的最右邊了,所以右邊不會有任何符號,代表一定是加 另外從右向左掃描也是可以的,只是把結尾數字先加上去而已,其餘邏輯差不多