1. 程式人生 > >LeetCode--Roman to Integer 羅馬數字轉化成整數

LeetCode--Roman to Integer 羅馬數字轉化成整數

題目:Given a roman numeral, convert it to an integer.

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

羅馬數轉化成數字問題,我們需要對於羅馬數字很熟悉才能完成轉換。以下截自百度百科:

羅馬數字是最早的數字表示方式,比阿拉伯數字早2000多年,起源於羅馬。 如今我們最常見的羅馬數字就是鐘錶的錶盤符號:Ⅰ,Ⅱ,Ⅲ,Ⅳ(IIII),Ⅴ,Ⅵ,Ⅶ,Ⅷ,Ⅸ,Ⅹ,Ⅺ,Ⅻ…… 對應阿拉伯數字(就是現在國際通用的數字),就是1,2,3,4,5,6,7,8,9,10,11,12。(注:阿拉伯數字
其實是古代印度人發明的,後來由阿拉伯人傳入歐洲,被歐洲人誤稱為阿拉伯數字。)
基本字元 I V X L C D M
相應的阿拉伯數字表示為 1 5 10 50 100 500 1000
1、相同的數字連寫,所表示的數等於這些數字相加得到的數,如:Ⅲ = 3; 2、小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數, 如:Ⅷ = 8;Ⅻ = 12; 3、小的數字,(限於Ⅰ、X 和C)在大的數字的左邊,所表示的數等於大數減小數得到的數,如:Ⅳ= 4;Ⅸ= 9; 4、正常使用時,連寫的數字重複不得超過三次。(錶盤上的四點鐘“IIII”例外) 5、在一個數的上面畫一條橫線,表示這個數擴大1000倍。 有幾條須注意掌握:
1、基本數字Ⅰ、X 、C 中的任何一個,自身連用構成數目,或者放在大數的右邊連用構成數目,都不能超過三個;放在大數的左邊只能用一個。 2、不能把基本數字V 、L 、D 中的任何一個作為小數放在大數的左邊採用相減的方法構成數目;放在大數的右邊採用相加的方式構成數目,只能使用一個。 3、V 和X 左邊的小數字只能用Ⅰ。 4、L 和C 左邊的小數字只能用X。 5、D 和M 左邊的小數字只能用C。 而這道題好就好在沒有讓我們來驗證輸入字串是不是羅馬數字,這樣省掉不少功夫。我們需要用到map資料結構,來將羅馬數字的字母轉化為對應的整數值,因為輸入的一定是羅馬數字,那麼我們只要考慮兩種情況即可: 第一,如果當前數字是最後一個數字,或者之後的數字比它小的話,則加上當前數字 第二,其他情況則減去這個數字 程式碼如下: 解法一:
class Solution {
public:
    int romanToInt(string s) {
        int res = 0;
        unordered_map<char, int> m{{'I', 1}, {'V', 5}, {'X', 10}, {'L', 50}, {'C', 100}, {'D', 500}, {'M', 1000}};
        for (int i = 0; i < s.size(); ++i) {
            int val = m[s[i]];
            if (i == s.size() - 1 || m[s[i+1]] <= m[s[i]]) res += val;
            else res -= val;
        }
        return res;
    }
};