鱼C论坛

 找回密码
 立即注册
查看: 1942|回复: 4

罗马数字转整数

[复制链接]
发表于 2020-11-26 11:58:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
class Solution:
    def romanToInt(self, s: str) -> int:
        f=0
        number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        special_one = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}
        #特殊的六种情况
        temp=s
        for each in special_one:
            if each in s:
                f+=special_one.get(each)
                temp.replace(each,'')
        for each in set(temp):
            A = temp.count(each)
            f += A* number_dict.get(each)
        return f
测试用例:"IV"
测试结果:10
期望结果:4
请问为啥出的结果不对啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-11-26 13:16:19 | 显示全部楼层
函数中有两次迭代
        for each in special_one:
            if each in s:
                f+=special_one.get(each)
                temp.replace(each,'')
第一次迭代f=4符合预期
再经历第二次迭代
        for each in set(temp):
            A = temp.count(each)
            f += A* number_dict.get(each)

f变成了10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-26 13:43:08 | 显示全部楼层
如果你只是测"IV" 就太简单了
我假设你是测试不同数量的 s
直接用while 就搞定了
number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
special_one = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}

s = list(s)
n = 0
while s:
    if len(s) == 1:
        n += number_dict[s[0]]
        del s[0]
    elif s[0]+s[1] in special_one:
        n += special_one[s[0]+s[1]]
        del s[:2]
    else:
        n += number_dict[s[0]]
        del s[0]
print(n)

稍微改下自己放进类里面去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-26 22:45:47 | 显示全部楼层
逃兵 发表于 2020-11-26 13:16
函数中有两次迭代

第一次迭代f=4符合预期

f=0
        b=0
        number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        special_one = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}
        #特殊的六种情况
        temp=s
        for each in special_one:
            if each in temp:
                f+=special_one.get(each)
                b=temp.replace(each,'')

        for i in set(b):
            A = b.count(i)
            f += A* number_dict.get(i)
        return f
他现在给我报错了 说红色这句话 ‘int’对象不可迭代,但我寻思set()后不是一个列表吗?
这个咋解决啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-11-27 14:45:35 | 显示全部楼层
本帖最后由 逃兵 于 2020-11-27 14:52 编辑
贾雨村 发表于 2020-11-26 22:45
f=0
        b=0
        number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}


按需求重写了份代码
执行逻辑,拆分每一个字母,将每一个字母转化成数字,最后加个0补位
左边数字比右边大的话就减,否则加
class Solution:
    def romanToInt(self, s: str) -> int:
        f = 0
        number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
        temp = s
        lst = [number_dict[i] for i in temp]+[0]
        for i in range(len(lst)-1):
            if lst[i] < lst[i+1]:
                f-=lst[i]
            else:
                f+=lst[i]


        return f
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-17 07:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表