鱼C论坛

 找回密码
 立即注册
查看: 1360|回复: 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 | 显示全部楼层
函数中有两次迭代
  1.         for each in special_one:
  2.             if each in s:
  3.                 f+=special_one.get(each)
  4.                 temp.replace(each,'')
复制代码

第一次迭代f=4符合预期
再经历第二次迭代
  1.         for each in set(temp):
  2.             A = temp.count(each)
  3.             f += A* number_dict.get(each)
复制代码


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

使用道具 举报

发表于 2020-11-26 13:43:08 | 显示全部楼层
如果你只是测"IV" 就太简单了
我假设你是测试不同数量的 s
直接用while 就搞定了

  1. number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
  2. special_one = {'IV': 4, 'IX': 9, 'XL': 40, 'XC': 90, 'CD': 400, 'CM': 900}

  3. s = list(s)
  4. n = 0
  5. while s:
  6.     if len(s) == 1:
  7.         n += number_dict[s[0]]
  8.         del s[0]
  9.     elif s[0]+s[1] in special_one:
  10.         n += special_one[s[0]+s[1]]
  11.         del s[:2]
  12.     else:
  13.         n += number_dict[s[0]]
  14.         del s[0]
  15. 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补位
左边数字比右边大的话就减,否则加
  1. class Solution:
  2.     def romanToInt(self, s: str) -> int:
  3.         f = 0
  4.         number_dict={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
  5.         temp = s
  6.         lst = [number_dict[i] for i in temp]+[0]
  7.         for i in range(len(lst)-1):
  8.             if lst[i] < lst[i+1]:
  9.                 f-=lst[i]
  10.             else:
  11.                 f+=lst[i]


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 05:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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