>[success] . 罗马数字转整数
~~~
1.罗马数字包含以下七种字符:I, V, X, L,C,D 和 M。
2.字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
3. 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
~~~
>[danger] ##### 解析
~~~
1.循环长度-1,无论长度奇偶,都只能循环到倒数第二位
2.IX 根据题意是 X-I 实际 也就是-I+X
3.注释一根据第一条定律,所以比较当前项和后一项的值大小,保证不会出现溢出的情况,如果大于加当前项
4.如果小于就从和中减去当前项
5.由于循环整理加减都是停留在倒数第二项,所以最后的结果加上最后一项
~~~
~~~
class Solution(object):
def romanToInt(self, s):
sum=0
convert={'M': 1000,'D': 500 ,'C': 100,'L': 50,'X': 10,'V': 5,'I': 1}
for i in range(len(s)-1):
# 注释一
if convert[s[i]]<convert[s[i+1]]:
sum=sum-convert[s[i]]
# 注释二
else:
sum=sum+convert[s[i]]
# 注释三
return sum+convert[s[-1]]
~~~
* 第一的解法
~~~
1.对每一个字符串 比较,循环每一个字符串,别切记录上一个字符串的值
2.每次循环记录当前值到last_num,下次循环这个值就变成了上一次的值
3.至于为什么要减去上一次值2倍,举例例如 VIV 实际 公式V-I+V ,由于我们每次都做了比较,
如果上一次的差不减倍,就变成了V+I+V-I, 而实际IV 才是一个整体,然而IV 中的I 和第一个
V 做了 运算,这里我们就要减去 实际V+I+V-I-I,这种只会出现在 小大的数,所以做差减去2倍
~~~
~~~
def romanToInt(s):
"""
:type s: str
:rtype: int
"""
roman_map = {"I": 1, "V": 5, "X": 10, "L": 50, "C": 100, "D": 500, "M": 1000}
# 记录总和
result = 0
# 记录上一次值
last_num = None
for char in s:
# 获取当前值
current_num = roman_map[char]
if last_num is None or last_num >= current_num:
result += current_num
elif last_num < current_num:
result += current_num - 2 * last_num
# 记录当前值在上一次值变量中,这样下次循环就变成了上一次值
last_num = current_num
return result
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构