首页 > 代码库 > Roman to Integer问题

Roman to Integer问题

问题描述:

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

 

这个比之前的Integer To Roman还要简单一些,罗马数字转换到整数的话,举个一般的例子,LXVI==50+10+5+1==66,再举个例子,LXIV==50+10+(5-1)==64。基本上我们只要对第二个例子的情况做一些处理就好了。

int romanToInt(char* s) {
    int i=0,j=0,num=0;
    char roman[7]={M,D,C,L,X,V,I};
    int value[7]={1000,500,100,50,10,5,1};
    while(s[i]!=\0){
        while(s[i]!=roman[j])
            j++;
        if((j-1>=0&&s[i+1]==roman[j-1])||(j-2>=0&&s[i+1]==roman[j-2])){
            if(s[i+1]==roman[j-1])
                num+=value[j-1]-value[j];
            else
                num+=value[j-2]-value[j];
            i++;
        }
        else
            num+=value[j];
        i++;
    }
    return num;
}

我注意到这个算法下IIV(应该不是合法的罗马数字)的值将是1+(5-1)==5。而LeetCode给出的expected answer是3,也就是5-(2*1),所以我又写了另一个版本。

int romanToInt(char* s) {
    int i=0,j=0,num=0,rp=1;
    char roman[7]={M,D,C,L,X,V,I};
    int value[7]={1000,500,100,50,10,5,1};
    while(s[i]!=\0){
        rp=1;
        while(s[i]!=roman[j])
            j++;
        while(s[i]==s[i+1]){
            rp++;
            i++;
        }
        if((j-1>=0&&s[i+1]==roman[j-1])||(j-2>=0&&s[i+1]==roman[j-2])){
            if(s[i+1]==roman[j-1])
                num+=value[j-1]-rp*value[j];
            else
                num+=value[j-2]-rp*value[j];
            i++;
        }
        else
            num+=rp*value[j];
        i++;
    }
    return num;
}

也就是多了一个rp(repeat)变量来处理连续出现的罗马字符数。

Roman to Integer问题