题目直接截图于力扣(LeetCode)。算法
该题网址:https://leetcode-cn.com/problems/roman-to-integer/函数
题很简单,貌似没用到什么复杂的算法。spa
观察罗马数字的写法,能够获得一个很简单的规律:当前一个数字的值比后一个数字大时,直接将两个数加起来,不然先减去前一个数,而后再加上当前数-前一个数的值...就这样一直到字符串结束,最后返回相加的结果便可。指针
1 int getInt(char c) // 获取字符对应的整数 2 { 3 int r; 4 switch(c) 5 { 6 case 'I': r = 1; break; 7 case 'V': r = 5; break; 8 case 'X': r = 10; break; 9 case 'L': r = 50; break; 10 case 'C': r = 100; break; 11 case 'D': r = 500; break; 12 case 'M': r = 1000; break; // 给的通常都是符合要求的,不用考虑那些异常状况。 13 } 14 return r; 15 } 16 17 int romanToInt(char * s){ 18 int len = strlen(s); // 获取字符指针的长度,也能够本身写一个函数,但速度会降低一点。 19 if(len == 0) 20 { 21 return 0; 22 } 23 int i; 24 int n; 25 int r = getInt(s[0]); 26 for(i = 1; i < len; i++) 27 { 28 if(getInt(s[i-1]) >= getInt(s[i])) // 判断前一个当前数字和前一个数字那个数字大,若是前一个数字大于其后的数字,直接相加值。 29 { 30 r += getInt(s[i]); 31 } 32 else // 不然先减去前一个数字,而后再加上【当前数字减去前一个数字】的值。 33 { 34 r -= getInt(s[i-1]); 35 n = getInt(s[i]) - getInt(s[i-1]); 36 r += n; 37 } 38 } 39 return r; 40 }