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