1. 程式人生 > >【LeetCode】013. Roman to Integer

【LeetCode】013. Roman to Integer

BE ant dot range 不能 code action lin get


Given a roman numeral, convert it to an integer.

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

題解:

  只要知道羅馬數字的規律即可

  

基本字符 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。 轉自:Grandyang
 1 class Solution {
 2 public:
 3     int romanToInt(string s) {
 4         int n = s.size();
5 int res = 0; 6 unordered_map<char, int> map = { { I , 1 }, 7 { V , 5 }, 8 { X , 10 }, 9 { L , 50 }, 10 { C , 100 }, 11 {
D , 500 }, 12 { M , 1000 } }; 13 for (int i = 0; i < n; ++i) { 14 int num = map[s[i]]; 15 if (i == n - 1 || map[s[i + 1]] <= map[s[i]]) 16 res += num; 17 else 18 res -= num; 19 } 20 21 return res; 22 } 23 };

【LeetCode】013. Roman to Integer