一、首先来看leetcode官方题解:. - 力扣(LeetCode)
详细代码内容如下:
class Solution {
private:
unordered_map<char, int> symbolValues = {
{'I', 1},
{'V', 5},
{'X', 10},
{'L', 50},
{'C', 100},
{'D', 500},
{'M', 1000},
};
public:
int romanToInt(string s) {
int ans = 0;
int n = s.length();
for (int i = 0; i < n; ++i) {
int value = symbolValues[s[i]];
if (i < n - 1 && value < symbolValues[s[i + 1]]) {
ans -= value;
} else {
ans += value;
}
}
return ans;
}
};
作者:力扣官方题解
二、根据官方题解,我们进行代码的逐行讲解。
1.
class Solution {
首先,class Solution 定义了一个Solution类,通常在 编写算法中中,会将解决方案封装在一个类中;(类 是一种自定义的数据类型,用于封装数据和操作这些数据的函数。类定义了对象的属性(数据成员)和行为(成员函数),而对象则是类的一个实例。)
2.
private:
private:下的成员变量和成员函数默认是私有的,不能直接在类外访问,因此这里的unordered_map 是私有成员,用于存储罗马数字符号到整数的映射。(其中分为private:类内部可以访问,类外部不能直接访问。public:类内外都可以访问。protected:类内可以访问,子类可以访问,但类外不能直接访问。)
3.
unordered_map<char, int> symbolValues
通过unordered_map<char, int> symbolValues,定义一个哈希表(unordered_map),键(key)是字符型 char,值(value)是整数型 int。这个哈希表用于存储罗马数字符号及其对应的整数值。例如,'I'
对应1,'V'
对应5,等等。symbolValues 的作用是将所有罗马数字符号与对应的整数值进行映射。
4.
public:
int romanToInt(string s) {
int ans = 0;
int n = s.length();
上面已经说到了public后面的成员函数是公有的,即可以在类外调用。
5. 然后在public后定义了一个公有函数 romanToInt ,它接受一个 string 类型的参数 S,表示一个罗马数字字符串,返回一个 int,表示该罗马数字转换后的整数值。
6.
int ans = 0;
随后定义了一个 int 变量 ans,用于存储最终转换的整数结果。初始值为 0。
7.
for (int i = 0; i < n; ++i) {
int value = symbolValues[s[i]];
使用一个 for
循环遍历字符串 s
中的每个字符。i
从 0 开始,直到 n - 1
,表示每个字符的位置。然后通过 symbolValues[s[i]]获取当前字符 s[i]
对应的整数值,并存储在 value
变量中。
8.
if (i < n - 1 && value < symbolValues[s[i + 1]]) {
ans -= value;
} else {
ans += value;
}
使用if (i < n - 1 && value < symbolValues[s[i + 1]])判断当前字符的值是否小于下一个字符的值,用于处理罗马数字的特殊规则,如果当前字符 s[i]
的值小于下一个字符 s[i + 1]
的值,意味着当前字符表示的是减法,例如 问题介绍中给出的几个特殊情况,'I'
在 'V'
前面表示 4,而 'I'
在 'X'
前面表示 9等。如满足上面的 if 条件,说明当前字符需要被从 ans
中减去(即ans = ans - value);当前字符的值不小于下一个字符的值,或者当前字符是最后一个字符,即执行ans = ans + value。
9.
return ans;
}
};
最终循环遍历完成后,返回 ans
,即最终转换的整数值。
好了,本篇博客关于leetcode题库中第13题中的罗马数字转整数,官方题解代码详细讲解到此就结束了,如果有任何疑问请在评论区留言,看到随时会回复的,祝大家都能快速轻松刷题。