大家好,我是开车的阿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;
    }
};

 京公网安备 11010502036488号
京公网安备 11010502036488号