Roman to Integer
首先要知道罗马数字的表示法,百度百科的解释是:
基本字符:
I、V、X、L、C、D、M
相应的阿拉伯数字表示为:
1、5、10、50、100、500、1000
-
相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
-
小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
-
小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
-
正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
-
在一个数的上面画一条横线,表示这个数扩大1000倍。
需要一个map获取每个基本字符到数字的映射。通过观察上面可知,要获得罗马数字的表示,可从前至后遍历每一个字符,比较每一个字符和后一个字符的大小,如果前一个字符大于等于后一个字符的话,就在总数里加上这个数;如果前一个字符小于后一个字符,就在总数里加上后一个字符减掉前一个字符的结果。复杂度为O(n)。
int getIndex(char input){ switch(input){ case 'I':return 1; case 'V':return 5; case 'X':return 10; case 'L':return 50; case 'C':return 100; case 'D':return 500; case 'M':return 1000; } } int romanToInt(string s){ int len = s.length(); int i; int tmp1, tmp2; int result = 0; for(i = 0;i < len-1; i++){ tmp1 = getIndex(s[i]); tmp2 = getIndex(s[i+1]); if(tmp1 >= tmp2) result += tmp1; else{ result += (tmp2 - tmp1); i++; } } if(i == len-1) result += getIndex(s[len-1]); return result; }