扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
13. Roman to Integer
创新互联公司总部坐落于成都市区,致力网站建设服务有网站设计制作、成都网站制作、网络营销策划、网页设计、网站维护、公众号搭建、微信小程序开发、软件开发等为企业提供一整套的信息化建设解决方案。创造真正意义上的网站建设,为互联网品牌在互动行销领域创造价值而不懈努力!Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
补充:罗马数字
罗马数字共有七个,即I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。按照下面的规则可以表示任意正整数。
重复数次:一个罗马数字重复几次,就表示这个数的几倍。
右加左减:在一个较大的罗马数字的右边记上一个较小的罗马数字,表示大数字加小数字。在一个较大的数字的左边记上一个较小的罗马数字,表示大数字减小数字。但是,左减不能跨越等级。比如,99不可以用IC表示,用XCIX表示。
加线乘千:在一个罗马数字的上方加上一条横线或者在右下方写M,表示将这个数字乘以1000,即是原数的1000倍。同理,如果上方有两条横线,即是原数的1000000倍。
单位限制:同样单位只能出现3次,如40不能表示为XXXX,而要表示为XL。
思路:
将字符串分为3部分,left,mid,right。
获取当前字符串的大单位m。记录位置,字符。
获取大单位连续出现的次数n。
通过递归,结果为m*n - 左边 + 右边。
代码如下:
int romanToInt(string s) { if (s.size() == 0) return 0; string left, right; mapromanMap; romanMap.insert(pair ('I', 1)); romanMap.insert(pair ('V', 5)); romanMap.insert(pair ('X', 10)); romanMap.insert(pair ('L', 50)); romanMap.insert(pair ('C', 100)); romanMap.insert(pair ('D', 500)); romanMap.insert(pair ('M', 1000)); int maxGrade = 0; //最高级 char maxChar = '\0'; int maxGrades = 0;//最高级次数 int maxGradePos = 0; //最高级位置 for (int i = 0; i < s.size(); i++)//获取最高级字符,最高级位置 { if (romanMap[s[i]] > maxGrade) { maxGrade = romanMap[s[i]]; maxChar = s[i]; maxGradePos = i; } } for (int i = maxGradePos; i < s.size(); i++)//获取最高级连续次数 { if (s[i] == maxChar) maxGrades++; else break; } left = s.substr(0, maxGradePos); right = s.substr(maxGradePos + maxGrades); return maxGrades * maxGrade - romanToInt(left) + romanToInt(right); }
参考他人做法:
参考网址:http://blog.csdn.net/feliciafay/article/details/17259547
观察到罗马数字和Integer的转换的小规律是:
IV = 5 - 1 = (-1) + 5 = 4
VI = 5 + 1 = 5 + 1 = 6
I在V前面,由于I比V小,所以I被解释为负数。
V在I后面,由于V比I大,所以V给解释为整数。
继续看几个例子。
VII = 5 + 1 + 1 = 7
IX = (-1) + 10 = 9
所以,可以一次把输入字符串扫描一遍,从第一个字符开始,到最后一个字符为止,一次比较当前字符a和当前字符的下一个字符b。如果a< b ,解释为 b - a,否则如果a >= b, 解释为a + b。 实际上,由于每次总是比较2个相邻的字符,所以是下标是从0开始,到inputstring.length()-2结束。
代码如下:
class Solution { public: int romanToInt(string s) { int sum = 0; int start = 0; char char_arr[] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'}; int int_arr[] = {1, 5, 10, 50, 100, 500, 1000}; std::maproman_map; int map_len = sizeof(char_arr)/sizeof(char); for (int i = 0; i< map_len; ++i) roman_map.insert(std::pair (char_arr[i], int_arr[i])); for (int i = 0; i < s.length() - 1; ++i) { if (roman_map[s[i]]>=roman_map[s[i + 1]]) sum += roman_map[s[i]]; else sum -= roman_map[s[i]]; } sum += roman_map[s[s.length()-1]]; return sum; } };
2016-08-10 15:44:23
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流