菜鸟心得001

菜鸟心得001

LeetCode字符串简单题13:罗马数字转整数

思路:根据ds,本题用字典才是最简单最快的方法,但是由于本人还没学字典的用法,所以第一反应是用笨拙的逐字循环读取,根据已知条件计算求和。

问题和方案:

1.for循环不熟悉:for i in range(start,stop,step)stop和step写反了导致所有罗马数字只读取第一个数。

2.for i in range()因为两个罗马数字组合在一起可能有特殊的计算方式,所以我原本希望遇到这种特殊情况用一个elif分支单独判断完成后修改i的值跳过已经被考虑过的下一个数,但是由于range方法的特性,在实际执行过程中不管循环体内对i做了什么操作,执行下一次循环的时候还是执行i+1操作,导致计算结果和预期不同。所以这里我把for循环改成了while循环 while i < len(s),手动操作i的值规避这个问题。

3.如果一定要用for循环呢?我们可以再定义一个布尔变量,用来标记在处理该数字的时候下一个数字需不需要跳过,例如,如果该变量的值为TRUE,则直接continue,直接回到for循环,让for循环自动将i+1,实现跳过。

总结:在遍历的时候如果需要跳过元素,while循环远比for循环灵活;两个循环的时间复杂度都是O(n),空间复杂度都是O(1)

https://leetcode-cn.com/problems/roman-to-integer/