一、前记(4/4)

这周周末要考试,可能会停更blog一段时间。这次的题目非常有意思。

二、题目描述

(u1s1,这道题的思路非常有意思)

三、题目分析

1、我的分析

在题目里面已经详细的描述了罗马数字在转换成数字的时候规则,即:最低位遇到4,9有特殊规则。因此我们可以使用Python3的字典,来对第i位和i+1位进行比较,如果第i位的数字小于第i+1位的数字,那么就是特殊规则(例:IV,IX)等,所以借此,我们可以使用分段累加的方式来将罗马数字转换成数字。

#encoding:utf-8
class Solution:
    def romanToInt(self, s: str) -> int:
        di = {"I":1,"V":5,"X":10,"L":50,"C":100,"D":500,"M":1000}   #利用字典的方式将罗马数字分段
        i=0
        result = 0
        while i<len(s)-1:
            if di[s[i]] >= di[s[i+1]]:  #检查前一位数是否大于后一位数,如果是则确定是正常的数字表达方式
                result += di[s[i]]  #累加
                i+=1
            else:
                temp=di[s[i+1]]-di[s[i]]    #如果不是,则用后一位数字减去前一位数字,得到的数字为正确的数字
                result += temp  #累加
                i+=2    #这一步非常关键,因为这一次用了两个字母,所以i要加2

        if i== len(s)-1:
            result += di[s[i]] 
        return result

#as checking
solution = Solution()
x="III"
print(solution.romanToInt(x))

2、别人的思路

其实大部分都是和我一样的,使用了一个字典。但是有一个家伙,他使用了双字符数字。如何构建双字符数字?就是将所有的特殊情况列举出来了。然后当遇到例如IV时,第一个字典对应的是A,第二个字典将A对应到了4,诸如此类。

class Solution:
    def romanToInt(self, s: str) -> int:
        num_dict1 = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'A':4,'B':9,'E':40,'G':90,'K':400,'P':900}
        num_dict2 = {'IV':'A','IX':'B','XL':'E','XC':'G','CD':'K','CM':'P'}
       
        for key,value in num_dict2.items():
            s = s.replace(key,value)
        num = 0
        for alpha in s:
            num += num_dict1[alpha]

        return num

四、学到了什么?

学到了字典构造。并且知道了双字典构造如何构造。开拓了思路。