leetcode 13: Roman to Integer

覺得版面太空趕快先寫一題來灌個水,經典的羅馬數字轉阿拉伯數字(連結) 基本上這題就是找出羅馬數字的規則,其實就兩點

  1. 符號的值由左向右遞減
  2. 左減右加,如果一個比較小的值被放在左邊就會是減,像是 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是因為,它已經在字串的最右邊了,所以右邊不會有任何符號,代表一定是加 另外從右向左掃描也是可以的,只是把結尾數字先加上去而已,其餘邏輯差不多


309 Words

2019-02-02T19:31:23