leetcode/roman to integer

如今我們最常見的羅馬數字就是鐘錶的錶盤符號:Ⅰ,Ⅱ,Ⅲ,Ⅳ(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數據結構,來將羅馬數字的字母轉化爲對應的整數值,因爲輸入的一定是羅馬數字,那麼我們只要考慮兩種情況即可:
第一,如果當前數字是最後一個數字,或者之後的數字比它小的話,則加上當前數字
第二,其他情況則減去這個數字



以下是寫的代碼


#include <iostream>
#include <unordered_map>
using namespace std;

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;
    }
};

int main(){
    Solution a;
    string s = "XC";
    cout<<a.romanToInt(s)<<endl;
    return 0;
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章