哈喽朋友们!欢迎收看今日的小李力扣题方法分享 今天我们来讨论“罗马数字转整数”的问题
方法一:逐字符分析
1、方法思路:通过if-else嵌套实现直观的计算,先写出I X C在特殊情况下的计算方法,然后是正
常情况下这三种字母的计算方法 最后写出其他字母的计算方法
2、优缺点分析:不涉及什么复杂的函数和算法 简单直观 但代码较冗长 内存占用较大
下面演示C++的该方法代码~
class Solution {
public:
int romanToInt(string s) {
int count = 0;
for (int i = 0; i < s.size(); ++i) {
if (s[i] == 'I') {
if (i + 1 < s.size() && s[i + 1] == 'V') {
count += 4;
++i;
} else if (i + 1 < s.size() && s[i + 1] == 'X') {
count += 9;
++i;
} else {
count += 1;
}
} else if (s[i] == 'X') {
if (i + 1 < s.size() && s[i + 1] == 'L') {
count += 40;
++i;
} else if (i + 1 < s.size() && s[i + 1] == 'C') {
count += 90;
++i;
} else {
count += 10;
}
} else if (s[i] == 'C') {
if (i + 1 < s.size() && s[i + 1] == 'D') {
count += 400;
++i;
} else if (i + 1 < s.size() && s[i + 1] == 'M') {
count += 900;
++i;
} else {
count += 100;
}
} else if (s[i] == 'V') {
count += 5;
} else if (s[i] == 'L') {
count += 50;
} else if (s[i] == 'D') {
count += 500;
} else if (s[i] == 'M') {
count += 1000;
}
}
return count;
}
};
方法二:映射法
1、思路介绍:通过映射给出每个罗马数字对应的值 再按罗马数的计算规则计算
2、相关语法:
①Python中的字典:
通过键值对存储数据 键必须唯一 值可以重复;通过键访问值 查找速度快;
使用场景:快速寻找键的对应值 构建映射关系(将一种数据格式转换为另一种)
②为了区分 介绍一下元组:
元组通过索引存储元素 元素不可修改 元素可以重复;通过索引来访问元素;
③def romanToInt(self, s:str) -> int: self当前对象实例、s:str参数s是字符串类型、->int返回值类型
是整数
④python中的len()方法用于获取字符串长度、列表 元组等的元素个数
⑤enumerate()函数用于将一个可遍历的数据对象组合为一个索引序列 同时给出数据和下标
3、优缺点分析:速度快 代码简洁
下面是python的代码演示~
class Solution:
# 定义一个字典 将罗马数字映射对应的整数值
SYMBOL_VALUES = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
def romanToInt(self, s: str) -> int:
ans = 0
n = len(s) # 获取字符串s的长度
for i, ch in enumerate(s): # i表示索引 ch表示当前遍历到的字符
value = Solution.SYMBOL_VALUES[ch] #获取到字符ch 赋值给value
if i < n - 1 and value < Solution.SYMBOL_VALUES[s[i + 1]]:
ans -= value
else:
ans += value
return ans
# 按照罗马数的逻辑 数值更大的在前面 特殊情况就是要把小数值放前面的情况 比如IV表示4
# 基于这种情况写出遍历算法 如果当前遍历到的值小于后面的值 要把它减掉 如IV=4=-1+5
好的朋友们 今天的分享就到这里啦~ 希望能帮到大家~
如果有什么新的想法 也欢迎大家的点赞 评论和收藏~
下期同一时间 我们不见不散~