Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
解题:
将字符形式的罗马数字,转化为整形。输入在1~3999之间。罗马数字的书写规范,请参见罗马数字_百度百科;
本题的关键点在于,如何处理I、X、C三个数字放在大数左边是相减,放在大数右边是相加。
解法是,可以从输入字符串的末端开始,从右向左遍历字符串。对于出现的一般罗马字符,进行累加,当出现I、X、C时,判断当前累加值是否达到(>=)5、50、500。如果达到则为相减,如果未达到,则为相加。
原因是,单反需要相减,必定是在大数的左边,因此必定大数已经出现。
1 class Solution {
2 public:
3 int romanToInt(string s) {
4 int len = s.length();
5 int sum = 0;
6
7 for (int i=len-1; i>=0; --i) {
8 if (s[i] == 'I')
9 sum += sum >= 5 ? -1 : 1;
10
11 if (s[i] == 'V')
12 sum += 5;
13
14 if (s[i] == 'X')
15 sum += sum >= 50 ? -10 : 10;
16
17 if (s[i] == 'L')
18 sum += 50;
19
20 if (s[i] == 'C')
21 sum += sum >= 500 ? -100 : 100;
22
23 if (s[i] == 'D')
24 sum += 500;
25
26 if (s[i] == 'M')
27 sum += 1000;
28 }
29
30 return sum;
31 }
32 };