題目:
Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
來源:http://oj.leetcode.com/problems/roman-to-integer/
思路:
Background:
首先,學習一下羅馬數字,參考羅馬數字
羅馬數字是最古老的數字表示方式,比阿拉伯數組早2000多年,起源於羅馬
基本字符 | I | V | X | L | C | D | M |
對應阿拉伯數字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
- 相同的數字連寫,所表示的數等於這些數字相加得到的數,例如:III = 3
- 小的數字在大的數字右邊,所表示的數等於這些數字相加得到的數,例如:VIII = 8
- 小的數字,限於(I、X和C)在大的數字左邊,所表示的數等於大數減去小數所得的數,例如:IV = 4
- 正常使用時,連續的數字重複不得超過三次
- 在一個數的上面畫橫線,表示這個數擴大1000倍(本題只考慮3999以內的數,所以用不到這條規則)
從前向後遍歷羅馬字母,從前向後遍歷羅馬數字,如果某個數比前一個數小,則加上該數。反之,減去前一個數的兩倍然後加上該數(因爲這裏是先加上之前的數了,所以如果之前數小於當前數,必須減去兩次)
C++ AC代碼:
class Solution {
public:
int romanToInt( string s ) {
int Integer = 0;
for (int i = 0; i < s.size(); i++){
if (i > 0 && charToInt(s[i]) > charToInt(s[i-1]))
Integer += charToInt(s[i])-2*charToInt(s[i-1]);
else
Integer += charToInt(s[i]);
}
return Integer;
}
public:
int charToInt( char c ) {
switch( c ) {
case 'I':return 1;break;
case 'V':return 5;break;
case 'X':return 10;break;
case 'L':return 50;break;
case 'C':return 100;break;
case 'D':return 500;break;
case 'M':return 1000;break;
default:return 0;break;
}
}
};
運行時間 352ms