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