注:本題總結了羅馬數字的表示規律並設計算法實現羅馬數字與阿拉伯數字的轉換
Leetcode 13
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
羅馬數字的規律:
I. 相同數字連寫,所表示的數等於這些數字相加得到的數;
II. 小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數;
III. 小的數字,僅限於I、X、C,在大的數字的左邊,所表示的數等於大數減小數得到的數
IV. 正常使用時連寫的數字重複不得超過三次;
V. 在一個數的上面畫一條橫線,表示這個數增值1000倍
算法:
- 當第i+1的數小於第i的數,那麼將他們加起來即可;
- 反之,減去兩倍第i的數,然後加上第i+1的數。
代碼如下:
/*2017/9/14 Roman to Integer
思路:
(1) 羅馬數字的基本字符:I、V、X、L、C、D、M
分別對應: 1、5、10、50、100、500、1000
(2) 羅馬數字的規律:
I. 相同數字連寫,所表示的數等於這些數字相加得到的數;
II. 小的數字在大的數字的右邊,所表示的數等於這些數字相加得到的數;
III. 小的數字,僅限於I、X、C,在大的數字的左邊,所表示的數等於大數減小數得到的數
IV. 正常使用時連寫的數字重複不得超過三次;
V. 在一個數的上面畫一條橫線,表示這個數增值1000倍
總而言之,本題的算法如下:
當第i+1的數小於第i的數,那麼將他們加起來即可;
反之,減去兩倍第i的數,然後加上第i+1的數。
(3) 解題思路
I. 定義一個map,用於存儲羅馬數字的基本字符,方便直接通過索引獲取羅馬數字基本字符對應的數字
II. 算法核心部分,就是(2)V.中的實現
*/
class Solution {
public:
int romanToInt(string s) {
/*將Roma數字的基本字符及其對應的阿拉伯數字存入到map容器中*/
map<char, int> Roman_elem;
Roman_elem.insert(pair<char, int>('I', 1));
Roman_elem.insert(pair<char, int>('V', 5));
Roman_elem.insert(pair<char, int>('X', 10));
Roman_elem.insert(pair<char, int>('L', 50));
Roman_elem.insert(pair<char, int>('C', 100));
Roman_elem.insert(pair<char, int>('D', 500));
Roman_elem.insert(pair<char, int>('M', 1000));
/*算法的核心實現部分*/
int sum = Roman_elem[s[0]];
for (int i = 1; i < s.size(); ++i) {
if (Roman_elem[s[i]] <= Roman_elem[s[i-1]]) {
sum += Roman_elem[s[i]];
} else {
sum = sum - 2*Roman_elem[s[i-1]] + Roman_elem[s[i]];
}
}
return sum;
}
};