Roman to Integer

首先要知道罗马数字的表示法,百度百科的解释是:

  基本字符:
  I、V、X、L、C、D、M
  相应的阿拉伯数字表示为:
  1、5、10、50、100、500、1000
  1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
  2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
  3. 小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
  4. 正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
  5. 在一个数的上面画一条横线,表示这个数扩大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;
}

 

posted on 2013-09-21 22:07  waruzhi  阅读(196)  评论(0编辑  收藏  举报

导航