大家好,我是开车的阿Q,自动驾驶的时代已经到来,没时间解释了,快和阿Q一起上车。作为自动驾驶系统工程师,必须要有最好的C++基础,让我们来一起刷题吧。

题目考察的知识点

  • 哈希表的使用
  • 字符串处理
  • 罗马数字转整数

题目解答方法的文字分析

本题要求编写一个函数,计算每头牛的罗马数字之和。罗马数字转整数的规则如下:

  • I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  • X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
  • C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

为了方便转换,可以创建一个哈希表 unordered_map<char, int>,将罗马数字字符映射为对应的数值。

然后,对于每头牛的罗马数字,我们可以通过遍历字符串的每个字符,并根据上述规则计算每个字符对应的数值,然后累加得到最终结果。

在遍历字符过程中,需要注意处理特殊情况,即当前字符的数值比前一个字符的数值大的情况,这时需要将前一个字符的数值的两倍减去。

本题解析所用的编程语言

C++

完整且正确的编程代码

#include <vector>
#include <unordered_map>
using namespace std;

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param cowsRomanNumeral string字符串vector 
     * @return int整型
     */
    int sumOfRomanNumerals(vector<string>& cowsRomanNumeral) {
        // 创建一个哈希表,用于记录罗马数字字符与对应的数值
        unordered_map<char, int> romanMap = {
            {'I', 1},
            {'V', 5},
            {'X', 10},
            {'L', 50},
            {'C', 100},
            {'D', 500},
            {'M', 1000}
        };

        int sum = 0; // 总和

        int currentValue = 0; // 当前字符的数值

        // 遍历每头牛的罗马数字

        for (string& roman : cowsRomanNumeral) {
            // 遍历罗马数字字符串的每个字符
            int prevValue = 0; // 前一个字符的数值
            for (int i = 0; i < roman.size(); i++) {
                // 获取当前字符的数值
                currentValue = romanMap[roman[i]];

                // 如果当前字符的数值比前一个字符的数值大,则需要减去前一个字符的数值的两倍(因为前一个字符已经被加过一次了)
                if (currentValue > prevValue) {
                    sum -= prevValue * 2;
                }

                // 累加当前字符的数值
                sum += currentValue;

                // 更新前一个字符的数值为当前字符的数值,为下一次遍历做准备
                prevValue = currentValue;
            }
        }

        return sum;
    }
};

您的关注、点赞、收藏就是我创作的动力,三连支持阿Q!