首页 > 解决方案 > 我的“罗马数字到整数”代码错误

问题描述

有人能告诉我为什么我的代码不工作并给出错误的输出吗?我认为逻辑是正确的,所以我不确定我犯了哪些错误。谢谢

    int romanToInt(string s) {
        unordered_map<char, int> map ={{'M',1000},{'D',500},{'C',100},{'L',50},{'X',10},{'V',5},{'I',1}};
        int result = 0;
        
        
        for(int i=0;i<s.size();i++)
        {
            if(map[s[i]]>=map[s[i+1]])
                result+=map[s[i]];
            else
                result+=(map[s[i+1]]-map[s[i]]);
        }
        
        return result;
    }

测试用例

Input: "IV"
Output: 9
Expected: 4

标签: c++

解决方案


您的代码有问题的是您正在比较字符的 ASCII 值而不是它们的数值。此外,您不应该添加map[s[i+1]],因为您将添加该值两次(一次在 stepi和 step i + 1)。此外,您应该更加小心s[i+1],因为索引可能超出范围。所以首先,检查索引是否为 n - 1 (最后一个字符)。

这是我的方法:

int from_roman(string roman) {
    map<char,int> values={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};
    int i,n=roman.length(),val=0;
    for(i=0;i<n;i++)
    {
        if(i==n-1||values[roman[i]]>=values[roman[i+1]])
            val+=values[roman[i]];
        else
            val-=values[roman[i]];
    }
    return val;
}

或者如果您愿意,可以使用更紧凑的版本:

int from_roman(string roman) {
    map<char,int> values={{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}};  
    int i,n=roman.length(),val=0;
    for(i=0;i<n;i++)val+=(i==n-1||values[roman[i]]>=values[roman[i+1]]?1:-1)*values[roman[i]];
    return val; 
}

推荐阅读