力扣第13题:13.罗马数字转整数学习记录和思路

今天做了力扣的第十三题,13.罗马数字转整数

一开始一直在思考罗马数字怎么算的,为什么49写作IL是错的,正确应该写作 XLIX。没整懂

后来我想着左边的比右边的小就减,不然就加。那我就不需要研究机制是什么了,我直接切片if判断不就行了吗

但怎么开始呢?

现在脑子里是切片和if,所以我干脆顺着往下想

因为要切片,那肯定要个列表或者字典之类的,所以我把七个字符整成了一个字典

numbers = {'I':1, 'V':5, 'X':10, 'L':50, 'C': 100, 'D':500, "M":1000}

然后我假设s = "IV",循环取"I"和"V",然后比较"I"小于"V",那就V减I,否则就加嘛

但有个问题,我怎么让V-I呢,那万一多了我不得写代码写死

后来想了下,5-1不就是0-1+5么,我直接整个初始0然后判断大小再加减不就行了

好了,思路基本有了

但问题是我应该怎么将s和numbers对应呢?

我先遍历s,然后for i in s:

for i in s:

这个时候仔细想想不对劲啊,其实我不需要遍历到最后一个元素啊,因为最后一个不需要比较呀,我直接把前面的算出来,直接加不就好了

那我怎么遍历到倒数第二个啊,我记得切片[:-1]不就可以切到倒数第二个来着,于是

class Solution:
    def romanToInt(self, s: str) -> int:
        numbers = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, "M": 1000}
        result = 0
        for i in s[:-1]:
            if numbers[i] < numbers[i+1]:
                result -= numbers[i]

solution = Solution()
s = solution.romanToInt("IV")

执行的时候出问题了

D:\Python\python.exe D:\pycharm\pythonProject\草稿\力扣题\test.py 
Traceback (most recent call last):
  File "D:\pycharm\pythonProject\草稿\力扣题\test.py", line 11, in <module>
    s = solution.romanToInt("IV")
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\pycharm\pythonProject\草稿\力扣题\test.py", line 6, in romanToInt
    if numbers[i] < numbers[i+1]:
                            ~^~
TypeError: can only concatenate str (not "int") to str

进程已结束,退出代码1

意思是你不能把字符串和整数拼一起 (str肯定是不能拼int的)。还有个问题就是,这个“i”它取的是字符串你是不可以像切片一样i+1来迭代取到下一个元素的,你只能对索引这样玩儿。

所以我们把它变成索引,这样的话就要先算它有几个元素,然后整个序列,这样就相当于给s里每个元素编了个可以迭代的编号。

for i in range(len(s) - 1):
#例如s = 'IV',那么len(s)就是2,
#而range(2-1)也就是range(1),结果就是0,
#然后i遍历这个0,那么i就是0

那个 - 1就是别忘了我们不需要算最后一个,因为按照我们的想法,通过比较的话,最后一个跟谁比呢?而对于python而言,取一个没有的值就会越界,就会报错,而且我们也知道了只需要把最后一个值加上去就行了,那我们就在返回结果的时候加呗。

好了,现在我们应该解决的问题是怎么取第一个值和第一个值后面的那个值进行比较;刚才我处理不了的那个问题对于我来说很难,不过现在我们有了索引就很简单了,我们可以i+1了

于是

if numbers[s[i]] < numbers[s[i + 1]]:
#例如s = 'IV',i=0,那么s[i]就是"I"
#那么也就是numbers['I']

*注意 字典不可以通过整数进行索引,只能通过键Key进行索引

(我知道这个事情,但写的时候我就直接忽视了..所以提一下..)

然后按0-1+5上套,就是

result = 0
if numbers[s[i]] < numbers[s[i + 1]]:
    result -= numbers[s[i]]
    #result = result - numbers[s[i]]
    #0 = 0 - 1 结果也就是-1

 把最后一个值加上去

return result + numbers[s[-1]]

补充一下剩余的逻辑

class Solution:
    def romanToInt(self, s: str) -> int:
        numbers = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, "M": 1000}
        result = 0
        for i in range(len(s) - 1):
            if numbers[s[i]] < numbers[s[i + 1]]:
                result -= numbers[s[i]]
            else:
                result += numbers[s[i]]
        return result + numbers[s[-1]]
solution = Solution()
s = solution.romanToInt("IV")
print(s)

成功啦哈哈

总结

知道了字符串不能像索引一样迭代取下一个元素

字典只能通过键Key来索引,不能用整数来索引

感觉range(len())很有用,学会了新知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值