玄元一墨 2024-02-08 15:21 采纳率: 70%
浏览 8

算法罗马数字转整数问题怎么做

C++初学,在做力扣上的题目时(罗马数字转整数)不知道哪里出了问题,望解答

测试用例:MCMXCIV

输出:2216

标准答案:1994

#include <iostream>
#include <string>
#include <unordered_map>

using namespace std;

char RomaNums[7] = { 'I', 'V', 'X', 'L', 'C', 'D', 'M' };

unordered_map<std::string, int> RomaNum = {
        {"I", 1},
        {"V", 5},
        {"X", 10},
        {"L", 50},
        {"C", 100},
        {"D", 500},
        {"M", 1000}
};

class Solution {
public:

    int count_char_num(const string str, const char ch)
    {
        // 统计数
        int const_num = 0;

        // 遍历字符串
        size_t pos = str.find(ch);
        while (pos != string::npos) {
            pos = str.find(ch, pos + 1);
            const_num++;
        }

        return const_num;
    }

    int romanToInt(string str) {
        int count_sum = 0;

        for (int i = 0; i < 7; i++)
        {
            int num = Solution::count_char_num(str, RomaNums[i]);
            string str(1, RomaNums[i]);

            count_sum += (num * static_cast<int>(RomaNum[str]));
        }

        return count_sum;
    }
};

int main()
{
    Solution Obj;
    cout << Obj.romanToInt("MCMXCIV") << endl;

    return 0;
}
  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-08 15:22
    关注

    引自免费微信小程序:皆我百晓生

    您提供的代码实现了一个基本的罗马数字转整数算法,但是这个实现存在一些问题。在罗马数字中,某些字符组合代表不同的数值,例如“IV”表示4,“IX”表示9,“XL”表示40,“XC”表示90,“CD”表示400,“CM”表示900。当前的实现没有考虑到这种特殊情况,它只是简单地统计了每个字符出现的次数并转换为对应的阿拉伯数字。

    为了修正这个问题,我们需要改进romanToInt函数,使其能够识别并正确处理这些特殊的前后字符组合。以下是修改后的Solution类:

    #include <iostream>
    #include <string>
    #include <unordered_map>
    
    class Solution {
    public:
        unordered_map<char, int> romaValue = {
            {'I', 1},
            {'V', 5},
            {'X', 10},
            {'L', 50},
            {'C', 100},
            {'D', 500},
            {'M', 1000}
        };
    
        int romanToInt(string s) {
            int result = 0;
            for (int i = 0; i < s.size(); ++i) {
                if (i > 0 && romaValue[s[i]] > romaValue[s[i - 1]]) {
                    // 当前字符值大于前一个字符时,需要减去前一个字符值的两倍
                    result += romaValue[s[i]] - 2 * romaValue[s[i - 1]];
                } else {
                    // 否则直接加上当前字符值
                    result += romaValue[s[i]];
                }
            }
            return result;
        }
    };
    
    int main() {
        Solution Obj;
        cout << Obj.romanToInt("MCMXCIV") << endl;  // 输出:1994
        return 0;
    }
    

    这段代码首先定义了一个映射表romaValue存储罗马数字和它们对应的十进制值。然后,在romanToInt函数中遍历输入字符串s的每个字符,当发现当前字符的罗马数值大于前一个字符时,说明这里存在特殊组合情况,计算结果时应从前一个字符所代表的数值中扣除(因为是相减的情况),否则就直接将当前字符所代表的数值累加到结果中。这样就能正确处理罗马数字中的所有合法组合了。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月8日